类通过继承进行定制
- 超类(基类)列在了类开头的括号中
- 类从其超类中继承属性
- 实例会继承所有可读取类的属性
- 每个object.attribute都会开启新的独立搜索
- 逻辑的修改是通过创建子类对函数进行重写,而不是修改超类
- 类名首字母应该大写
一个demo
class FirstClass:
def setdate(self,value): # 类中的方法使用时会隐式传入类本身和值,所以需要一个self来接收本身
self.data = value # 新建类的一个变量并且赋值
def display(self):
print(self.data) # 调用类的变量,如果直接用data会会报错
class Second(FirstClass): # 重写类
def display(self):
print("Current value is %s"%self.data)
z = Second()
z.setdate(42)
z.display(42)
- 进一步的demo
class FistClass:
def setdate(self,value):
self.data = value
def display(self):
print(self.data)
class Second(FistClass):
def display(self):
print("Current value is %s"%self.data)
class ThirdClass(Second):
def __init__(self,value): # __init__作用为为类进行初始化
self.data = value
def __add__(self, other):
return ThirdClass(self.data+other)
def __str__(self): # 作用为输出类的描述性内容,当print时输出此内容
return '[ThirdClass:%s]'% self.data
def mul(self,other):
self.data *= other
a = ThirdClass('abc')
a.display()
print(a)
b = a + 'xyz'
b.display()
print(b)
a.mul(3)
print(a)
# Current value is abc
# [ThirdClass:abc]
# Current value is abcxyz
# [ThirdClass:abcxyz]
# [ThirdClass:abcabcabc]
更多实例
class Person:
def __init__(self,name,job = None,pay = 0):
self.name = name
self.job = job
self.pay = pay
def lastname(self):
return self.name.split()[-1]
def giveRaise(self,percent): # 涨工资方法
self.pay = int(self.pay * (1 + percent))
def __str__(self): # 每当打印类的时候调用这个方法
return "[Person:%s,%s]"%(self.name,self.pay)
class Manger(Person): # 一个管理者类,每次涨薪水固定10%加提成
def __init__(self,name,pay):
Person.__init__(self,name,'mgr',pay)
def giveRaise(self,percent,bonus = .10):
Person.giveRaise(self,percent+bonus) # 直接调用原始代码逻辑,方便后期代码维护
if __name__ == "__main__" :
bob = Person('Bob Smith')
sue = Person('Sue Jones', job='dev',pay=100000)
print(bob)
print(sue)
print(bob.lastname(),sue.lastname())
sue.giveRaise(.10)
print(sue)
tom = Manger('Tom Jones',50000)
tom.giveRaise(.10)
print(tom.lastname())
print(tom)
print('-----all three -----')
for object in (bob,sue,tom): # object仅仅是一个变量名,迭代对对象进行操作
object.giveRaise(.1)
print(object)
属性
class studeng():
def fget(self):
self._ages = int(self._ages)
return self._ages
def fset(self,ages):
self._ages = ages
def fdel(self):
pass
ages = property(fget,fset,fdel,'111')
s1 = studeng()
s1.ages = 18.8
print(s1.ages)
- 属性函数property:当被修饰的属性被调用时调用
- s1.ages = 18.8设置的时候调用fset
- print(s1.ages) print的时候调用fget
- del s1.ages销毁的时候调用fdel
魔法函数
- __init__当类被实例化的时候调用
- __call__当类被当做函数调用的时候使用
- __str__当类被print的时候调用
- __getattr__当调用一个不存在的属性的时候调用
class student():
def __init__(self,ages=18):
self.ages =ages
print(self.ages)
def __call__(self, *args, **kwargs):
print("i am called")
def __str__(self):
return "i am a function"
def __getattr__(self, item):
print(item,'is not exast')
a = student()
a()
print(a)
a.sy
'''
18
i am called
i am a function
sy is not exast
'''
实例方法、类方法和静态方法
class method():
def semple(self):
a='a'
print("this is a semple function")
@classmethod
def cla(cls):
b = 'b'
print("this is a claas method")
@staticmethod
def sta():
print("this is a static function")
att = method()
att.semple()
att.cla()
att.sta()
method.cla()
method.sta()
-
实例方法:定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
- 调用:只能由实例对象调用。
-
类方法定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
- 调用:实例对象和类对象都可以调用。
-
静态方法:定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
- 调用:实例对象和类对象都可以调用。
静态方法的特点:
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。