1. 类和对象的定义
类用class关键字声明,类中的变量成为属性,函数成为方法,定义方法的时候,需要带上self参数。
例: class Person: # 默认继承Object父类,也可以继承Str,Number等父类 name = 'dog' age = 12 def fav(self): print('喜欢跑步。') person = Person() # 实例化类 person.name # dog person.fav() # 喜欢跑步
2. 类的继承和重写
类的继承,类B继承类A,继承父类的所有属性和方法 class A: x = 22 def name(self): print('我是A') class B(A): pass b = B() b.x # 22 b.name() # 我是A 类的多继承,一个类可以继承多个父类,如果父类中存在相同的方法或属性,则从左往右就近继承 class D: x = 333 y = 33 def name(self): print('我是D') class E(A,D): pass e = E() e.x # 22 e.y # 33 e.name() # 我是A 类的重写,类C继承类A,如果类C中存在和父类A相同的属性和方法名,则会重写父类的属性和方法的内容 class C(A): x = 222 def name(self): print('我是C') c = C(): c.x # 222 c.name # 我是C
3. 类的组合
类的组合,即将类作为值赋给另一个类中的属性 class Dog: def say(self): print('汪汪汪') class Cat: def say(self): print('喵喵喵') class Animal: dog = Dog() cat = Cat() def say(self): self.dog.say() self.cat.say() Animal().say() # 汪汪汪 喵喵喵
4. self的作用
slef的作用 class Self: x = 22 def get_self(self): return self mySelf = Self() # 他们的结果都是一样的,说明这个self指的是对象的本身 print(mySelf.get_self()) # <__main__.self object at 0x000002CB88A9CA08> print(mySelf) # <__main__.self object at 0x000002CB88A9CA08> 类实例化对象后方法是共享的,属性是私有的 mySelf.y = 33 print(mySelf.y) # 33,mySelf对象的私有属性y mySelf1 = Self() mySelf1.x # 22 x是共有属性,是实例化类的 mySelf1.y # AttributeError: 'self' object has no attribute 'y' mySelf1.z = 44 print(mySelf1.z) # 44,z是mySelf对象的私有属性 查看对象的内部私有属性 mySelf.__dict__ # {'y': 33} mySelf1.__dict__ # {'z': 44}
5. 类的私有变量
1.以__下划线命名,表示这是私有变量,外部无法正常去访问
2.但是,他并不是一个真正的私有变量,他还是可以被外部访问到,只是被偷偷修改了名称,我们可以通过_类名+变量名来访问并操作值,并不建议
3._单个下划线开头的变量:代表仅供类内部使用的变量,约定俗成
例: class private: def __init__(self, x): self.x = x def set_x(self, x): self.__x = x def get_x(self): print(self.__x) myPrivate = private(100) print(myPrivate.__x) # 无法访问对象的内部私有属性值 通过内省,类内部的__x被改名为_private__x myPrivate.__dict__ # {'_privateVariable__x': 100} print(myPrivate._private__x) # 100 通过内部方法去修改值 myPrivate.set_x(200) 通过内部的方法去访问 myPrivate.get_x() # 200 也可以直接通过_类名+私有属性名的方式直接修改值 myPrivate._private__x = 300 myPrivate.get_x() # 300 不能通过动态添加对象属性的方法来增加类的属性 1. 直接通过添加变量的方式 myPrivate.y = 666 2. 通过字典的属性添加对象的属性__dict__[key] = value myPrivate.__dict__['z'] = 888 查看属性,发现属性的命名为发声改变,说明命名重写只发生在类内部产生的时候 print(myPrivate.__dict__) # {'_privateVariable__x': 300, 'y': 666, 'z': 888} 进一步验证,将类实例化另一个对象,并没有发现y和z的属性 myPrivate1 = private(1) print(myPrivate1.__dict__) # {'_privateVariable__x': 1} __slots__方法,限制对象可动态添加的属性,避免内存泄漏浪费 class Slots: __slots__ = ['x', 'y'] def __init__(self, x): self.x = x slots = Slots(100) print(slots.__dict__) # 报错,使用了__slots__方法就不存在__dict__方法了 print(slots.__slots__) # ['x', 'y'] 通过__slots__获取 可以添加__slots__中定义的属性名称,不可以随意添加 slots.y = 200 # 添加y属性 slots.z = 300 # 报错,因为__slots__不包含z属性 slots的继承 class S(Slots): pass s = S(666) print(s.x) # 666 继承了父类的属性 s.z = 777 print(s.z) # 777 可以添加自己的属性 print(s.__dict__) # {'z': 777} print(s.__slots__) # ['x', 'y']
6. 多肽
多肽:用一个函数调用类里面的方法,但是不确定调用的是哪个对象,首先类中要有函数中的方法
class A:
def XX(self):
print('我是AXX')
def YY(self):
print('我是AYY')
class B: def XX(self): print('我是BXX') def YY(self): print('我是BYY') class C: def XX(self): print('我是CXX') def YY(self): print('我是CYY') 声明函数来调用不同的类 def showTime(x): x.XX() x.YY() 多肽调用 showTime(A()) showTime(B()) showTime(C())
7. min-in混入
# 继承 class Animal: def __init__(self, name, age): self.name = name self.age = age def say(self): print(f'我叫{self.name},今年{self.age}岁。') class Love(Animal): # 继承Animal类 def fav(self): print('我喜欢吃西瓜!') # 实例化,都继承了类的方法和属性 c = Love('小米', 100) print(c.__dict__) # {'name': '小米', 'age': 100} c.say() # 我叫小米,今年100岁。 c.fav() # 我喜欢吃西瓜! # 混入mixn-in # 在定义一个混入类 class mixin: def fly(self): print('我还喜欢飞翔') class myMix(Animal, mixin): def fav(self): print('我喜欢贵的东西!') d = myMix('TT', 27) print(d.say()) # 我叫TT,今年27岁。 print(d.fly()) # 我还喜欢飞翔 print(d.fav()) # 我喜欢贵的东西! # 混入经典案例 class Displayer: # 第四步:调用display方法,打印出内容 def display(self, message): print('222') print(message) class LoggerMixin: # 第八步:开始执行log方法 def log(self, message, filename='logfile.txt'): with open(filename, 'a') as f: f.write(message) # 第二步:调用display1方法 def display1(self, message): print('111') # 第三步:super()其实指向的是mySubClass类,因为它当中才继承了display方法,指向display方法 super().display(message) # 第六步:执行完毕display方法后,self指向subclass,所以mySubClasslog方法指向执行mySubClass类中的mySubClasslog方法 print('333') self.mySubClasslog(message) print('444') class mySubClass(LoggerMixin, Displayer): # 第七步:执行mySubClasslog方法 def mySubClasslog(self, message): # 在mySubClasslog方法中的super()就是实例subclass,所以log方法是继承LoggerMixin类的 super().log(message, filename='subclass.txt') print('555') subclass = mySubClass() # 第一步:首先调用mySubClass类中继承LoggerMixin类的方法display1 subclass.display1('this is mixin') # [<class '__main__.mySubClass'>, <class '__main__.LoggerMixin'>, <class '__main__.Displayer'>, <class 'object'>] print(mySubClass.mro())
原文地址:http://www.cnblogs.com/chf333/p/16895906.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性