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()