欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PY__11 类和对象 继承

程序员文章站 2022-07-15 18:44:15
...

python

类和对象

class exployee:
    exployee_count=0  #查看人数
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary
        exployee.exployee_count+=1  #查看人数
    def display(self):
        print('my name is{0} and my salary is{1}'.format(self.name,self.salary))
===========================================================
ex1=exployee('admin',2000)  #构造方法
print(ex1.name,ex1.salary) #admin 2000  #不能遍历对象的属性

ex1.display()  #my name isadmin and my salary is2000

print(exployee.exployee_count) #1 共一个人
====================================================
del ex1.name  #删除ex1的name属性
print(ex1.name) #'exployee' object has no attribute 'name'
ex1=None  #手动回收
=====================================================
setattr(ex1,'salary',200)  #  添加属性
ex1.display()

hasatter(对象名,属性名)判断一个对象是否有这个属性

if hasattr(ex1,'salary'): #判断ex1是否有salary属性
    del ex1.salary
            #简写 hasatter(ex1,'salary') and  del ex1.salary
ex1.display()

isinstance(对象名,类名)判断一个对象是否属于这个类

class Exployee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

def  setSalary(obj):
    if isinstance(obj,Exployee): #若是属于Exployee类则发工资
        print('pay:{0}'.format(obj.salary))

ex1=Exployee('tom',2000)

setSalary(ex1)    #True
                    pay:2000
user={}
setSalary(user)  #False 不属于Exployee类所以不发工资

继承

class Exployee(object):
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary
    def display(self):
         print('my name is{0},and salary is{1}'.format(self.name, self.salary))

继承类的属性和行为

class Manager(Expoyee): #Manager类继承Exployee类的属性和行为
    def __init__(self,name,salary,bonus): # 写出Manager的所有属性
        super(Manager,self).__init__(name,salary) #写出Manager继承的属性
        self.bonus=bonus   # 写出Manager新增的属性


    def display(self): 重写 (重写父类的display方法,覆盖override)
        print('my name is{0},and salary is{1},bonus is{2}'.format(self.name,self.salary,self.bonus))

    #下面的写法更正规
    def display(self):
        super(Manager,self).display()
        print('and bonus is{0}'.format(self.bonus))

ex1=Manager('tom',2000,3000) #为Manager类创建对象,比原来的Exployee多了bouns
ex1.display()  #my name istom,and salary is2000,bonus is3000

print(isinstance(ex1,Exployee))#True
print(isinstance(ex1,Manager))#True  e1既属于Exployee类又属于Manager类

args可以为Manager添加不定数属性

class Manager(Exployee):
    def __init__(self,name,salary,bonus,*args):
        super(Manager,self).__init__(name,salary)
        self.bonus=bonus
        if args: # 若存则添加
            self.args=args
m1=Manager('joke',2000,300,12,13)
print(m1.args)

多继承和多态

多态,没有继承就没有多态

不同对象调用同一个方法出现不同结果

class Exployee(object):
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary

    def display(self):
         print('my name is{0},and salary is{1}'.format(self.name, self.salary))

class Room():
    def __init__(self,room_id):
        self.room_id=room_id

class Manager(Exployee,Room):
    def __init__(self,name,salary,bonus,room_id):
        super(Manager,self).__init__(name,salary)
                                                #Exployee.__init__(self, name, salary)
        Room.__init__(self,room_id)
        self.bonus=bonus

    def display(self):
        print('my name is{0},and salay is{1},and bonus is{2}'.format(self.name,self.salary,self.bonus))
m1=Manager('admin',2000,300,'308')
print(m1.room_id)

e1=Exployee('Tom',2000)

多态,没有继承就没有多态
不同对象调用同一个方法出现不同结果
e1.display()  #my name isTom,and salary is2000
m1.display()  #my name isadmin,and salay is2000,and bonus is300

动态绑定方法

from  types import MethodType
class Exployee(object): #任何类都是object类的子类

    def __init__(self,name,salary):
        self.name=name  #对象属性,实例属性
        self.salary=salary

def display(self):
         print('my name is{0},and salary is{1}'.format(self.name, self.salary))

ex01=Exployee('tom',200)
ex01.gener='male' #动态绑定属性
print(ex01.gener)

ex01.dis=MethodType(display,ex01) #动态添加行为
ex01.dis()
ex01.display=MethodType(display,ex01) #动态添加行为
ex01.display()  一般和后面的方法名写一样的名字

del ex01.dis  #动态删除行为
ex01.dis()