class OldStyle:
def __init__(self,name ,description):
self.name = name
self.description = description
class NewStyle:
def __init__(self, name, description):
self.name = name
self.description = description
if __name__ == '__main__':
old = OldStyle('old','Old style class')
print (old)
print (type(old))
print (dir(old))
print("_________________________________________")
new = NewStyle('new','New style class')
print(new)
print(type(new))
print (dir(new))
'''
定义类的属性
直接在类里定义
在构造函数中定义
访问控制?
其实没有访问控制
Python没提供私有属性的功能
全靠自觉
常用属性定义
class Programer(object):
def __init__(self, name , age , weight):
self.name = name
self._age = age 编程规范上的私有类
selg.__weight = weight
'''
类的继承
定义类的继承
class DerivedClassName(BaseClassName):
<statement -1>
.
.
.
<statement -n>
继承的子类
也可以自觉定义,覆盖父类的属性和方法
用super()调用父类的方法
class A(object):
def method(self,arg):
pass
class B(A):
def method(self,arg):
A.method(arg)
子类的类型判断
isintstance
issubclass
多继承
class DerivedClassName(Base1,Base2,Base3):
<statement -1>
.
.
.
<statement -n>
类的多态
多态的要素
继承
方法从写
常用的类定义
class Person(object):
def __init__(self , name, age)
self.name = name
self.age = age
def __new__(cls) 创建类的对象
def __init__(self) 初始化对象
回收对象
__del__()
用Magic Method实现的好处
优雅
被Python的标准语法支持
比较运算符
__cmp__(self,other)
__eq__(self,other)
__lt__(self,other)
__gt__(self,other)
数字运算符
__add__(self,other)
__sub__(self,other)
__mul__(self,other)
__div__(self,other)
逻辑运算符
__or__(self,other)
__and__(self,other)
转换为字符串
__str__
__repr__
__unicode__
展现对象属性
__dir__
设置对象属性
__setattr__(self,name,value):
需要注意的
def __setattr__(self,name,value):
setattr(self,name,vale) 错误的
def __setattr__(self, name , value)
self.__dict__[name] = value 正确的
查询对象属性
__getattr__(self, name):
__getattribute__(self,name):
输出对象属性
__delattr__(self,name):
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name , age , weight):
self.name = name
self._age = age #编程规范上的私有类
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print ("My name is %s \nI am %s years old\n" % (self.name ,self._age))
if __name__=="__main__":
programer = Programer('Albert',25,80)
print (dir(programer))
print (programer.__dict__)
print (programer.get_weight)
print (programer.get_hobby)
programer.self_introduction()
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name , age , weight):
self.name = name
self._age = age #编程规范上的私有类
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print ("My name is %s \nI am %s years old\n" % (self.name ,self._age))
class BackendProgramer(Programer):
def __init__(self , name ,age , weight, language):
super(BackendProgramer,self).__init__(name, age , weight)
self.language = language
if __name__=="__main__":
programer = BackendProgramer('Albert',25,80,'Python')
print (dir(programer))
print (programer.__dict__)
print (type(programer))
print (isinstance(programer,Programer))
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name , age , weight):
self.name = name
self._age = age #编程规范上的私有类
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print ("My name is %s \nI am %s years old\n" % (self.name ,self._age))
class BackendProgramer(Programer):
def __init__(self , name ,age , weight, language):
super(BackendProgramer,self).__init__(name, age , weight)
self.language = language
def self_introduction(self):
print ("My name is %s \nMy favorite language is %s\n" % (self.name ,self.language))
def introduce(programer):
if isinstance(programer,Programer):
programer.self_introduction()
if __name__=="__main__":
programer = Programer('Albert',25,80)
backend_programer = BackendProgramer('Tim',30,70,'python')
introduce(backend_programer)
introduce(programer)
#类的方法也是类的属性
class Test(object):
def test(self):
pass
if __name__=="__main__":
a = Test()
print (a.test)
a.test = '123'
print (a.test)
#定义类的方法
# @classmethod
#调用的时候用类名,而不是某个对象
#@property
#像访问属性一样调用方法
class Programer:
def __new__(cls, *args , **kwargs):
print("call __new__method")
print (args)
return super(Programer ,cls).__new__(cls)
def __init__(self,name,age):
print('call __init__ method')
self.name = name
self.age = age
if __name__ == '__main__':
programer = Programer('Albert',25)
print (programer.__dict__)
class Programer(object):
def __init__(self , name, age):
self.name = name
if isinstance(age,int):
self.age = age
else:
raise Exception('age must be int')
def __eq__(self,other):
if isinstance(other , Programer):
if self.age == other.age:
return True
else:
return False
else :
raise Exception('The type of object must be Programer')
def __add__(self, other):
if isinstance(other, Programer):
return self.age + other.age
else:
raise Exception('The type of object must be Programer')
if __name__ == '__main__':
p1 = Programer('Albert',25)
p2 = Programer('Bill',30)
print (p1 == p2)
print (p1+p2)
class Programer:
def __init__(self , name, age):
self.name = name
if isinstance(age,int):
self.age = age
else:
raise Exception('age must be int')
# def __str__(self):
# return '%s is %s years old'%(self.name , self.age)
# def __dir__(self):
# return self.__dir__.keys()
# 编译错误:AttributeError: 'function' object has no attribute 'keys'
if __name__ == '__main__':
p = Programer('Albert',25)
print (p)
print (dir(p))
class Programer(object):
def __init__(self, name , age ):
self.name = name
self.age = age #编程规范上的私有类
def __getattribute__(self,name):
# return getattr(self, name)
# return self.__dict__[name]
return super(Programer,self).__getattribute__(name)
def __setattr__(self,name,value):
setattr(self,name,value)
#self.__dict__[name] = value
if __name__=='__main__':
p = Programer('Albert',25)
print (p.name)