定义简单的类
面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象,就可以直接调用这些方法了!
定义只包含方法的类
在python中,要定义一个只包含方法的类,语法格式如下:
用class定义类名
class 类名:
def 方法1(self,参数列表) #方法的属性中有且仅有一个self
pass
def 方法2(self,参数列表) #类之外定义的def是函数,在类里面定义的def叫做方法,而且括号里必须要有self
pass
class Student:
pass
方法的定义格式和之前学习过的函数几乎一样
区别在于第一个参数必须是self
创建对象
当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:
对象变量名=类名()
第一个面向对象程序 需求: 小猫爱吃鱼,小猫要喝水
分析:
1.定义一个猫类(Cat)
2.定义两个方法ect和drink
3.按照需求--不需要定义属性
class Cat: #Cat为类的名称(类名),又一个或多个单词组成,每个单词首字母大写,其余字母小写
"""这是一个猫类"""
def ect(self): #定义方法
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
tom=Cat() #创建类的对象
big_tom=Cat() 每个类可以有多个对象,每个对象都会开辟新的存储空间id
tom.ect() #对象调用类中封装的方法,对象名.方法名()
tom.drink() #对象调用类中封装的方法
使用self在方法内部输出每一只猫的名字
由哪一个对象调用的方法,方法内self就是哪一个对象的引用
1.在类封装的方法内部,self就表示当前调用方法的对象自己
2.调用方法时,程序员不需要传递self参数
在方法内部:
1.也可以通过self访问对象的属性
2.也可以通过self调用其他的对象方法
改造代码如下
class Cat:
def eat(self):
print("%s 爱吃鱼"%self.name)
tom=Cat()
tom.name="Tom"
tom.eat()
lazy_cat=Cat()
lazy_cat.name="大懒猫"
lazy_cat.eat()
在日常开发中,不推荐在类的外部给对象增加属性
如果在运行时,没有找到属性,程序就会报错
对象应该包含有哪些属性,应该封装在类的内部
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
print("我的名字叫",name,"今年岁数是",age)
xiaoming=Student("小明",20)
xiaohong=Student("小红",18)
类的创建
类的创建:
class Student:
native_place="吉林" #类属性
def __init__(self,name,age): #name,age为实例属性
self.name=name
self.age=age
def eat(self):
print("我正在吃饭...")
#实例方法
def info(self):
print("我的名字叫:",self.name,"年龄是:",self.age)
#类方法
@classmethod
def cm(cls):
print("类方法")
#静态方法
@staticmethod
def sm():
print("静态方法")
对象的创建,创建Student类的对象
stu1=Student("张三",20) #创建对象
stu1.info() #对象调用类方法
stu1.eat()
print("我的名字叫",stu1.name,"今年的岁数是:",stu1.age,stu1.eat)
print(stu1)
类属性、类方法、静态方法
类属性:类中方法外的变量成为类属性,被该类的所有对象所共享
类方法:使用@calssmethod修饰方法,使用类名直接访问的方法
静态方法:使用@staticmethod修饰主法,使用类名直接访问的方法
print(Student.native_place) #访问类属性
Student.cm() #调用类方法
Student.sm() #调用静态方法
stu3=Student("张三",20)
stu4=Student("李四",30)
print(stu3.native_place) #吉林
print(stu4.native_place) #吉林
Student.native_place="天津" #改变类属性
print(stu3.native_place) #天津
print(stu4.native_place) #天津