私有属性
class Dog():
def init(self):
self.heart=100
d=Dog()
d.heart #访问不到,heart属于私有
在变量前加两个下划线,变量变为私有属性,外部不能访问,内部可以访问
def getheart():
return self.heart#提供对外的私有属性的访问方法
对私有属性的强制访问
d.Dogheart
公有属性(所有类共同拥有的属性)
class Dog()
type='京巴' #创建公有属性
d=Dog()
d2=Dog()
Dog.type #这样调用,是在所有类的对象的公有变量里设置
d.type#d,d2属性相同
d2.type#当用对象调用的时候,会在自己对象的内存里新建一个type变量
析构函数
d=Dog()
del d#删除对象名到内存空间的引用
继承
静态方法
名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性
author = 'Mr.Bool'
class Dog(object):
def init(self,name):
self.name=name
@staticmethod
def eat():
print("%s like eat 骨头"%self.name)
print('狗爱吃骨头')
@staticmethod
def eat(self):
print("%s like eat 骨头"%self.name)
# print('狗爱吃骨头')
def talk(self):
self.eat(self)
print('汪汪')
d=Dog("汪汪")
d.talk()
类方法
@classmethod
类方法只能访问类变量。不能访问实例变量。几乎很少用
属性方法
@property
把一个方法变成一个静态属性,不用括号调用。
class Dog():
def init(self):
pass
@property
def eat(self):
print('狗爱吃骨头')
@property
def eat(self,name):
print('狗爱吃%s'%self.name)
@eat.setter
def eat(self,foot):
print('set to foot:%s'%foot)
d=Dog()
d.eat 调用属性方法
d.eat='包子' 当属性方法需要传参数,就要重写一个方法,方法名与属性方法名相同
d.Eat='包子' 大写也可以
当删除属性方法时用
@eat.delete
def eat(self):
del self.__food
print('删完了')
类的描述信息
class Dog():
'''这个类是描述狗的'''
print(Dog.doc)输出 这个类是描述狗的
module 和 class
module输出 这个类是从哪个模块里
class输出类
call
对象后面加括号执行call
d=Dog()
d() 将调用Dog里的call方法
dict查看对象中的所有成员变量和方法,使用实例调用只打印实例内的属性,不包括类属性
str
在类里写
def str(self):
return ""%self.name
d直接打印对象就输出str里的内容
getitem,setitem,delitem,把类变成字典
class Foo(object):
def init(self):
self.data={}
pass
def getitem(self,key):
print('getitem',key)
return self.data.get(key)
pass
def setitem(self,key,value):
print('setitem',key)
self.data[key]=value
pass
def delitem(self,key):
print('delitem',key)
pass
obj=Foo()
obj['name']='alex'#自动触发执行 getitem
print(obj['name'] #自动触发执行 setitem
del obj['k1'] #自动触发执行delitem
new metaclass
类也是对象,type为类的类
class Dog():
pass
type(Dog) 会知道类的类为type
new方法在init构造函数方法前执行
new里面调用init
def new(cls,args,*kwargs):
print('Foo --new--')
return object.new(cls) 当return被注释时,init不会被调用,这句继承父类的new方法
metaclass原类
class MyType():
def init(self):
print("mytype init") 1
pass
def call(self):
print("mytype call") 2
class Dog():
metaclass=MyType
def init(self):
print("dog init") 4
pass
def new(self):
print("dog new") 3
call创建new new创建init
反射
getattr setattr hasattr delattr
class Foo(object):
def __init__(self):
self.name = 'wj'
def func(self):
return 'func'
obj = Foo()
检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')
获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func')
设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1)
删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')