静态属性实际上就是数据属性。
用 @property 修饰,对象在调用类的方法的时候,可以不用加小括号,就像调用数据属性一样。
不跟任何实例捆绑,只跟类捆绑。
用 @classmethod 修饰,类在调用类的方法时,自动向该方法的第一个参数传递类本身。
不与类绑定,也不与实例绑定。
用 @staticmethod 修饰,实例或类调用该方法,不自动传值。
class Cal:
'计算公式'
def __init__(self,a,b):
self.a = a
self.b = b
@property
def add(self):
return self.a + self.b
@classmethod
def doc(cls):
return cls.__doc__
@staticmethod
def sub(x,y):
return x-y
n1 = Cal(4,2)
print(n1.add) # 6
print(Cal.doc()) # 计算公式
print(n1.sub(5,2)) # 3
print(Cal.sub(7,2)) # 5
组合就是由一些小类组合成一个大类。
组合的作用是将类与类进行关联。
class School:
def __init__(self,sname,st):
self.sname = sname
self.student = st
class Student:
def __init__(self,name):
self.name = name
p1 = Student("CRTao")
s1 = School("BJTU",p1)
print(s1.student.name) # CRTao
python中的继承分为单继承和多继承。
class ParentClass1:
pass
class ParentClass2:
pass
#单继承
class SubClass(ParentClass1):
pass
#多继承
class SubClass(ParentClass1,ParentClass2):
pass
先查询子类的属性字典,查不到再查父类的属性字典。
class Dad:
'这个是爸爸类'
money=10
name="dad"
def __init__(self):
pass
class Son(Dad):
money = 20
def __init__(self):
pass
print(Son.money,Son.name) # 20 dad
s1 = Son()
print(s1.money,s1.name) # 20 dad
由继承,又引出派生的概念。派生就是子类由父类,又衍生出新的特性,但不会改变父类的属性。
①代码重用。但由于类之间需要去耦合,所以这种功能并不常用。
②接口继承,进行归一化设计。这种比较常用。即定义一个接口类,作为基类,子类继承于该基类,并实现接口中定义的方法。
import abc
class AllFile(metaclass=abc.ABCMeta): #定义接口类
@abc.abstractmethod # 指定的接口类方法
def read(self):
pass
@abc.abstractmethod # 指定的接口类方法
def write(self):
pass
class Cdrom(AllFile):
def read(self):
print('cdrom read')
def write(self):
print('cdrom write')
m1=Cdrom() # 如果子类没定义接口类指定的方法,实例化时会报错
在Python 3 中,多继承时,继承顺序采用广度优先遍历父类。
另外,可以通过MRO列表进行查询继承顺序。即:
类名.__mro__
class Vehicle():
def __init__(self,name):
self.name = name
def run(self):
print("vehicle running!")
class Subway(Vehicle):
def __init__(self,name,speed):
super().__init__(name)
self.speed = speed
def run(self):
super().run()
print("%s speed is %s" %(self.name,self.speed))
s1 = Subway("line 1","120")
s1.run()
'''
vehicle running!
line 1 speed is 120
'''