类与对象的理解与封装特征
- 类: 一个模板, (人类)---是一个抽象的, 没有实体的 - 对象: (eg: 张三, 李四) - 属性: (表示这类东西的特征, 眼睛, 嘴巴, 鼻子) - 方法: (表示这类物体可以做的事情, eg: 吃饭, 睡觉,学习) class team: team_count=30 team_name="lsgo" def practice(self): print('刻意练习') def learning_algorithm(self): print('学习算法') def count(self): print('团队的人数为%d'%self.team_count) t=team() print(t) print(type(t)) print(t.__class__) print(t.__class__.__name__) t.practice() t.learning_algorithm() t.count() # <__main__.team object at 0x000001EE0052FD08> <class '__main__.team'> <class '__main__.team'> team 刻意练习 学习算法 团队的人数为30self是什么? python的self相当于c++的this指针
<__main__.team object at 0x000001EE0052FD08> <class '__main__.team'> <class '__main__.team'> team 刻意练习 学习算法 团队的人数为30 # <__main__.test object at 0x0000018DAFA3FD48> <class '__main__.test'>类的方法与普通的函数只有一个特别的区别–他们必须有一个额外的第一参数名称(对应于该实数,即该对象本身),按照惯例它的名称是self。在调用方法时,我们无需明确提供与参数self相对应参数。 python的魔法方法 类有一个名为__init__(self[,param1,param2…])的魔法方法,该方法在该类实例化时会自动调用。
class team: team_count=30 def __init__(self,name): self.name=name def practice(self): print('刻意练习') def learning_algorithm(self): print('学习算法') def count(self): print('%s团队的人数为%d'%(self.name,self.team_count)) t1=team('t1') t2=team('t2') t1.count() t2.count() # t1团队的人数为30 t2团队的人数为30类的私有属性与私有方法
类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有, 不能在类地外部被使用或直接访问。 在类内部的方法中使用时 self.__private_attrs。 类的方法: 在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同, 类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。 self 的名字并不是规定死的(因为是形参),也可以使用 this,但是最好还是按照约定是用 self。 类的私有方法 __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 , 不能在类地外部调用。self.__private_methods。继承 原文链接:https://blog.csdn.net/zcx1203/article/details/89187495
class Animals(object): def __init__(self, name, age): self.name = name self.age= age def eat(self): print('eating......') class Dog(Animals): # 当Dog没有构造方法时,执行Animals里面的构造方法 def __init__(self, name, age, power): # self.name = name # self.age = age # 执行Dog的父类的构造方法; super(Dog, self).__init__(name, age) self.power = power def eat(self): print(self.power) super(Dog, self).eat() # 1. 如果子类没有的属性和方法, 则去父类找, 如果父类也没有, 就报错。 d1 = Dog("大黄",3,100) print(d1.name) print(d1.age) print(d1.power) d1.eat()·如果子类中定义与父类同名的方法或属性,则会自动覆盖父类的方法或属性。 ·调用未绑定的父类方法Animals.__init(self)__或者使用super函数super().init() 类属性与实例属性的区别 原文链接:https://blog.csdn.net/sehanlingfeng/article/details/92415782
# 类属性和实例属性 class Student: count = 10 # count是类属性 def __init__(self, name): self.name = name # name是实例属性 print(Student.count) # 10 通过类来访问类属性 # print(Student.name) # 报错:AttributeError: type object 'Student' has no attribute 'name' s1 = Student("xiaoming") print(s1.name) # xiaoming 必须通过实例来访问实例属性name print(s1.count) # 10 实例也可以访问类属性 # 通过实例更改类属性的值,不影响类访问类属性的值 s1.count = 50 print(s1.count) # 50 实例更改类属性的10为50 print(Student.count) # 10 通过类访问count的值,发现还是原来的10,并没有被改成50 # 通过类更改类属性的值,不影响实例访问类属性的值 Student.count = 33 print(s1.count) # 50 实例访问类属性值为上次更改的值50,不是类更改的值33 print(Student.count) # 33 类访问类属性的值是被更改的33 # 另外实例化一个对象,其值不是默认值,而是上次由类更改类属性后的值 s2 = Student("xiaohua") print(s2.count) # 33 此处对象访问的count值为33,而不是默认值10,也不是之前由对象更改的值50 print(Student.count) # 33 这里也是33,而不是默认值10IBF 1、issubclass(class,classinfo)
含义:如果class是classinfo的子类,则返回True,否则返回false,用来判断子类关系
2、isinstance(objiect,classinfo)
含义:检查一个实例对象是否属于一个类,第一个参数为实例对象,第二个为类
3、hasattr(object,name)
作用:测试一个对象(object)是否具有固定的属性(name),属性必须带“ ”,表明是字符串。
4、getattr(object,name[,default])
作用:返回一个特定对象的属性的特定值(前提是该对象具有该属性),如果该对象没有这个属性,则为了提高用户的体验,可以将第三个参数default设置为“你所访问的属性不存在”,这样当不存在属性的时候就可以返回“你所访问的属性不存在”。
5、setattr(object,name,value)
作用:对对象进行属性的新定义——设置新属性
6、delattr(object,name)
作用:用来删除对象的固定属性,如果该对象没有这个属性的话,就会抛出异常
7、property(fget=none,fset=none,fdel=none.doc=none)
作用:通过属性定义属性,property() 是一个比较奇葩的BIF,它的作用把方法当作属性来访问,从而提供更加友好访问方式。
property() 返回一个可以设置属性的属性,当然如何设置属性还是需要我们人为来写代码。第一个参数是获得属性的方法名(例子中是 getx),第二个参数是设置属性的方法名(例子中是 setx),第三个参数是删除属性的方法名(例子中是 delx)。
