python-类

 

 对象属性:

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

 

 

 

 

 

 

 天子骄龙

posted @ 2019-04-03 15:24  天子骄龙  阅读(233)  评论(0编辑  收藏  举报