1.__self__属性/动态属性的使用
class Student(object):
def __init__(self,x,y):
self.name = x
self.age = y
def run(self):
print(self.name,'在跑步')
def eat(self):
print(self.name,'在吃饭')
s1 = Student('zhangsan',1)
s2 = Student('haha',18)
s1.run()
s1.eat()
s2.run()
s1.name = 'zhangliu'
s1.city = '上海'
print('name:{},city:{}' .format(s1.name,s1.city))
2. __slots__属性的使用
class Student(object):
__slots__ = ('name')
def __init__(self,x,y):
self.name = x
self.age = y
def run(self):
print(self.name,'在跑步')
def eat(self):
print(self.name,'在吃饭')
def __del__(self):
print('__del__方法被调用了')
s1 = Student('zhangsan',1)
s2 = Student('haha',18)
s1.run()
s1.eat()
time.sleep(10)
s2.run()
3. 魔法方法
3.1 call
import time
import datetime
class Student(object):
def __init__(self,x,y):
self.name = x
self.age = y
def run(self):
print(self.name,'在跑步')
def eat(self):
print(self.name,'在吃饭')
def __del__(self):
print('__del__方法被调用了')
def __call__(self,*args,**kwargs):
print('__call__方法被调用了')
print('args={},kwargs={}'.format(args,kwargs))
fn = kwargs['fn']
return fn(args[0],args[1])
s1 = Student('zhangsan',1)
s2 = Student('haha',18)
s1.run()
s1.eat()
time.sleep(2)
s2.run()
n = s1(1,2,fn = lambda x,y : x+y)
print(n)
⚠️在不定义__call__方法情况下调用对象,即 s1() ,会报错:‘Student" object is not callable
3.2 eq
class Person(object):
def __init__(self,x,y):
self.name = x
self.age = y
def eat(self):
print(self.name,'在吃饭')
def run(self):
print(self.age,'岁的',self.name,'在跑步')
def __eq__(self, other):
if self.name == other.name and self.age == self.age:
return True
return False
s1 = Person('zhangsan',15)
s2 = Person('zhangsan',15)
s1.eat()
s2.run()
print(s1 is s2)
print(s1 == s2)
4.内置属性
class Person(object):
"""
这是一段注释
"""
def __init__(self,name,age):
self.name = name
self.age = age
def run(self):
print(self.name,'在跑步')
def __gt__(self,other):
return self.age > other.age
p1 = Person('张三',15)
p2 = Person('李四',16)
p1.run()
print(dir(p1))
print(dir(Person))
print(p1.__class__)
print((p2.__dict__))
print(Person.__dict__)
print('p1.__dir__:',p1.__dir__)
print(p1.__doc__)
print(Person.__doc__)
print(p1 > p2)
print(p1.__module__)
5.把对象当作字典操作
class Person(object):
def __init__(self,name,age,city):
self.name = name
self.age = age
self.city = city
def __setitem__(self, key, value):
self.__dict__[key] = value
def __getitem__(self, item):
return self.__dict__[item]
p = Person('张三',19,'北京')
print(p.__dict__)
p['name'] = '赵四'
print(p.__dict__)
print(p['name'])
6.对象属性和类属性
class Person(object):
type = '人类'
def __init__(self,name,age):
self.name = name
self.age = age
p1 = Person('张三',18)
p2 = Person('赵四',19)
print(Person.type)
print(p1.type)
print(p2.type)
Person.type = 'moon'
print(Person.type)
print(p1.type)
print(p2.type)
p1.type = 'human'
print(Person.type)
print(p1.type)
print(p2.type)
7.对象方法,类方法,静态方法