面向对象的成员
一.变量
1.实例变量
实例里的变量,由对象去访问的变量
2.类的变量
类里的变量,这个变量属于类,但是对象也可以访问.最好用类名访问
class Person: country = "大清" # 类的变量 def __init__(self, name, gender): self.name = name # 实例变量 对象里的变量 self.gender = gender Person.country = "大名" # Person.gender = "男" p = Person("小明", "未知") p2 = Person("小小", "两性") # p.country = "新中国" print(p.country) print(p2.country) # 类的变量可以给对象使用 print(Person.country) # 类的变量最好使用类名来访问 # print(dir(Person))
二.方法
1.实例方法
实例方法就是属于对象的方法,需要实例化后访问.
2.类方法(@classmethod)
类方法属于类的,在声明的时候需要给出一个能接收类名的cls,和self效果一样
3.静态方法(@staticmethod)
静态方法也是属于类的,静态方法就好比我们在类里定义了一个函数. 使用类名去访问
class Computer: def play(self): # 这就是实例方法 print("电脑可以扫雷") @classmethod # 装饰器 ,此时这个方法是一个类的方法 def chat(cls): # 此时接收到的cls是类名 print("电脑可以聊天") @staticmethod # 此时这是一个 静态方法 def listen(): print("电脑可以听听音乐") c = Computer() c.chat() # 在调用类方法的时候 默认的把类名传递给类方法 # 类的东西可以看成是全局的东西 Computer.chat() # 最好是谁的东西谁去用 Computer.listen() # 推荐使用类名访问
三.属性
在方法上添加一个@property .可以把一个方法编程一个属性.但是这个属性不能更改 也就是不能赋值
当我们需要一个经过计算才能得到结果的时候用,必须用return返回结果
class Person: def __init__(self,name,gender ,birth): self.name = name self.gender = gender # self.age = 2018 - birth self.birth = birth # 需要算出来的属性 用property @property # 把一个方法更改成一个属性,每次拿属性的时候都会执行这个方法 # 方法的返回值就是属性 def age(self): return 2018 - self.birth p = Person("小明","未知",2000) print(p.age) # 看着像一个变量一样使用 其实是调用了一个方法 不能赋值
四.私有
所有以双下划线开头不以双下划线结尾的方法,变量都是私有内容.在类的外边无法访问,除非在类中曝光.
class Person: __qie = "潘潘" # 类变量的私有 def __init__(self,name,mimi): self.name = name self.__mimi = mimi # 实例变量的私有 def gaosu(self): print(f"{self.__mimi}") # 私有内容只能在class内访问到 print(Person.__qie) def __yue(self): # 实例方法的私有 print("走 一起看电影") @classmethod def __chi(cls): # 类的方法的私有 print("一起吃饭") @staticmethod def __he(): # 静态方法的私有 print("一起喝") p = Person("五二","和嫂子") p.gaosu() p.yue() # 报错 因为在外面访问不到