类通过继承进行定制

  • 超类(基类)列在了类开头的括号中
  • 类从其超类中继承属性
  • 实例会继承所有可读取类的属性
  • 每个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”参数,但是方法体中不能使用类或实例的任何属性和方法;

    • 调用:实例对象和类对象都可以调用。

静态方法的特点:

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

posted on 2019-11-13 20:28  盈盈的月儿  阅读(161)  评论(0编辑  收藏  举报