python面向对象之成员
成员
在类中写的所有内容都是类的成员
变量
实例变量: 由对象去访问的变量
1 class Person: 2 def __init__(self,name,birth): 3 self.name = name # 实例变量,对象里的变量(对象.属性) 4 self.birth = birth 5 p = Person('bob','1900') 6 print(p.name) 7 print(p.birth) 8 p.birth = 1937 9 print(p.birth) 10 结果 11 bob 12 1900 13 1937
类变量: 变量属于类,但是对象也可以访问
1 class Person: 2 country = '中国' 3 def __init__(self,name,birth): 4 self.name = name 5 self.birth = birth 6 p = Person('bob',1937) 7 p2 = Person('jack',2000) 8 print(p.country) 9 print(p2.country) 10 p.country = '法国' 11 print(p.country) 12 print(p2.country) 13 Person.country = '美国' # 类变量最好是使用类名来访问 14 print(p.country) # 类变量可以给对象使用 15 print(p2.country) 16 结果 17 中国 18 中国 19 法国 20 中国 21 法国 22 美国
方法
实例方法: 使用 对象.方法()
特点: 在声明的时候,需要给出self,self必须放在第一个位置,在调用的时候,自动的会把对象传递给形参的self
1 class Person: 2 def chi(self): #chi实例方法 3 print('吃饭') 4 在定义实例方法的时候,必须给出一个参数 self 5 形参的第一个参数,自动的把对象给传递进来 6 def he(self): #self是当前类的对象 7 print(self) 8 print('喝水') 9 p = Person() 10 p.he() #调用的时候不需要手动给出self 11 print(p) 12 结果 13 <__main__.Person object at 0x000002289B6F72E8> 14 喝水 15 <__main__.Person object at 0x000002289B6F72E8>
类方法 @classmethod : 类方法是属于类的
特点: 在声明的时候需要给出一个能够接受类名的参数 cls,也必须放在参数的第一个,在调用的时候,自动得把xx对象的类传递给cls
1 class Person: 2 def chi(self): 3 print('吃饭') 4 @classmethod #类方法 5 def he(cls): # 接收到的cls是类名 6 print('喝水') 7 p = Person() #用对象访问 8 p.he() #在调用类方法的时候,默认的把类名传递给类方法 9 Person.he() # 类方法一般用类名去访问 10 结果 11 喝水 12 喝水
静态方法@staticmethod: 静态方法也是属于类的,静态方法就好比,我们在类中定义了一个函数,静态方法一般和类方法差不多,使用类名去访问
1 class Person: 2 @staticmethod #静态方法 3 def chi(): 4 print('吃饭') 5 p = Person #静态方法可以使用对象访问,也可以使用类名访问,但是一般推荐使用类名访问 6 p.chi() 7 Person.chi() #推荐使用类名访问 8 结果 9 吃饭 10 吃饭
属性
在方法上添加一个@property,可以把一个方法变成一个属性,但是这个属性不可以被赋值
当某一个属性必须经过计算才能得到结果的时候用
1 class Person: 2 def __init__(self,name,birth): 3 self.name = name 4 self.birth = birth 5 # 把一个方法更改成一个属性,每次拿属性的时候都会自动的去执行这个方法 6 # 方法的返回值就是属性值 7 # 年龄,应该是算出来的,而不是直接存储 8 @property 9 def age(self): # 实例方法 10 print('方法') 11 return 2018 - self.birth 12 p1 = Person('bob',2000) 13 print(p1.age) #看着像一个变量一样使用,实际上这里是调用的一个方法(方法不可修改) 14 结果 15 方法 16 18
私有
所有以双下划线开头的方法,变量都是私有内容,外界无法访问,除非你主动暴露这些内容
1 class Person: 2 __he = '可乐' 3 def __init__(self,name,mimi): 4 self.name = name 5 self.__mimi = mimi # 私有内容,实例变量 6 def shuo(self): 7 print('这个秘密是%s'%self.__mimi) #如果公开就能调用了 8 print(Person.__he) # 私有的类变量只能在类中调用 9 return self.__mimi 10 # 公开了__mimi和__he这个两个私有变量 11 12 def __wan(self): # 私有的实例方法 13 print('找刘丽玩') 14 @staticmethod 15 def __xiao(): 16 print('刘丽特别爱笑') 17 @classmethod 18 def __xue(cls): 19 print('学习') 20 p = Person('bob','万物皆空') 21 # print(Person.__he) # 私有类变量只能在类里面调用(在外调用报错) 22 # print(p.__mimi) # 私有的类属性只能在类里面调用(在外调用报错) 23 # Person.__xiao() # 私有的类方法只能在类里面调用(在外调用报错) 24 p.shuo() 25 结果 26 这个秘密是万物皆空 27 可乐