python基础笔记11—类与对象
定义
类:不同的数据类型属于不同的类,也称为类对象
对象:类下包含的一个具体的内容
类的创建
class Student :#Student为类名
pass
类名:可由1个或多个单词组成,每个单词的首字母大写,其余小写
- 类的组成
- 类属性:直接写在类里的变量
- 实例方法:在类内定义的函数,使用self(self表示类的实例)
- 静态方法:使用staticmethod进行修饰的、在类内定义的函数(不能使用self)
- 类方法:使用了classmethod进行修饰的、在类内定义的函数,使用cls
class Student: #Student为类名
native_place='吉林'#native_place为类属性(类内的一个对象)
#初始化方法
def __init__(self,name,age):
self.name=name#赋值操作,把局部变量name赋给了实例属性self.name
self.age=age
# 实例方法(相当于在类外定义的函数)
def eat(self):
print('你好')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我使用了classmethod进行修饰,所以是类方法')
类对象的创建(类的实例化)
把类对象视为是返回该类的一个新实例的不带参数的函数
创建类的实例:
实例名=类名()
- 调用类中的内容:
- 对象名.方法名()
- 类名.方法名(类的对象)
stu1=Student('张三',20)#前面类的创建中,init方法中有2个参数,stu1是类的一个实例
stu1.eat() #对象名.方法名()
#与stu1.eat()相同,都是调用Student类中的eat方法
Student.eat(stu1) #类名.方法名(类的对象)——>实际上是类中方法定义处的self
类属性、 类方法、静态方法
- 类属性:
类中定义在方法外的变量,被该类的所有对象所共享(类内的全局变量)
使用方式:
类名.类属性
绑定在实例上的属性不会影响其他实例,但类本身也是一个对象,如果在类上绑定属性,则所有实例都可以访问该类的属性,并且所有实例访问的类属性都是同一个!!!记住,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
print(Student.native_place) #吉林,输出的是类中类属性native_place的值
stu1=Student('张三',20)#吉林
stu2=Student('李四',22)#吉林
print(stu1.native_place)
print(stu2.native_place)
Student.native_place='天津'#通过类名修改类属性,所有实例的类属性被改变
print(stu1.native_place)#天津
print(stu2.native_place)#天津
- 类方法:
使用了classmethod进行修饰的、在类内定义的函数,使用cls
使用类名直接访问的方法
调用方式:类名.方法名()
- 静态方法:
使用staticmethod进行修饰的、在类内定义的函数
使用类名直接访问的方法
调用方式:类名.方法名()
Student.cm()#调用类方法
Student.method()#调用静态方法
动态绑定属性和方法
python是动态语言,在创建对象之后,可以动态地绑定属性和方法
一个类对象可以创建这个类的N多个实例对象,每个实例对象的属性值可以不同。
- 动态绑定属性:创建一个实例对象后,在类外为特定实例对象添加一个属性。
例:在Student类中,为实例stu1增加属性性别,指定为‘女’
class Student: #Student为类名
native_place='吉林'#native_place为类属性
#初始化方法
def __init__(self,name,age):
self.name=name#赋值操作,把局部变量name赋给了实例属性self.name
self.age=age
# 实例方法(相当于在类外定义的函数)
def eat(self):
print(self.name+'在吃饭')
stu1=Student('张三',20)
stu2=Student('李四',23)
print(id(stu1))
print(id(stu2))
print('-------为stu1动态绑定性别-------------')
stu1.gender='女'#动态绑定性别
print(stu1.name,stu1.age,stu1.gender)
- 动态绑定方法
def show():
print('定义在类之外,称为函数')
stu1.show=show#将show方法绑定在实例stu1上
stu1.show()
#stu2.show() 报错,因为stu2没有绑定show方法