对象属性:
class A:
pass
s=A()
s.num=10 #动态增加一个对象属性
s.name='张三'
s.age=18
print(s.num)
print(s.__dict__) #返回对象的所有属性,不包含类属性
#{'num': 10, 'name': '张三', 'age': 18}
del s.age #删除属性
s.__dict__={'name':'lm','num':1001} #动态增加属性
#A.__dict__={'wuli':78} #这是错误的 这种方式可以增加对象属性,不能增加和修改类属性
类.__dict__ 是只读的,不能写
对象__dict__ 是可读可写的
限制对象属性的添加:
class A: __slots__ = ['age','id'] #这个类只能添加的属性 age=18 #增加一个类属性 id=1001 d=A()
类属性:
class A:
age=18 #增加一个类属性
id=1001
A.num = 100 #动态增加一个类属性
del A.id #删除类属性
方法:
实例方法(对象方法):方法的第一个参数一般是self
类方法:
静态方法:
动态创建类:
#动态创建类:利用元类创建类对象 def func(self): print('函数') AAA=type('Dog',(),{'age':18,'func':func}) #AAA 类的对象名 #参数1 类名称 参数2 元组-父类 #参数3 字典:属性和方法 d=AAA() print(d.age) d.func()
视频教程 https://www.bilibili.com/video/av50407114/
私有属性和受保护属性:
前面加一个下划线是受保护属性 _x 只能在类内和子类中访问
前面加二个下划线是私有属性 __x 只能在类内访问
s=isinstance(a,A) 判断a是不是类A的对象
是 返回true,不是返回false
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()
例子
>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
>>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True
True
issubclass(class, classinfo) 判断参数 class 是否是classinfo 的子类
如果 class 是 classinfo 的子类返回 True,否则返回 False。
print(d.__class__) #返回创建对象的类
单继承:
class A(): pass class B(): pass class A1(A,B): pass print(A1.__bases__) #返回类A1的基类 #(<class '__main__.A'>, <class '__main__.B'>)
初始化函数:如果子类本身有就执行子类的,如果子类没有就执行父类的
class A(): def __init__(self,name,age): self.name=name self.age=age def eat(self): print('吃药') class A1(A): def __init__(self,name,age,jinqian): #子类继承了父类的方法 #A.__init__(self,name,age) #执行父类初始化函数--方法一 #只有执行父类初始化函数,子类才有self.name、self.age属性 #super(A1,self).__init__(name,age) #执行父类初始化函数--方法二 super().__init__(name, age) # 执行父类初始化函数--方法三 #A1,self 可以省略 self.jinqian=jinqian #派生属性(父类没有的属性) class A2(A): def __init__(self,name,age,jinqian): #子类继承了父类的方法 A.__init__(self,name,age) #执行父类初始化函数 #只有执行父类初始化函数,子类才有self.name、self.age属性 self.jinqian=jinqian #派生属性(父类没有的属性) def eat(self): #重写父类方法 #父类子类都有就执行子类自己的,子类没有才到父类寻找 print('吃饭') #如果还想执行父类的同名方法,就需要调用 A.eat(self) d1=A1('张三',24,100) d1.eat() d2=A2('李四',24,100) d2.eat()
天子骄龙