面向对象编程概述01
部分细节就不再过多的描述了,主要记一些不太懂的或者记忆模糊的地方
对象分为两种:
-
类对象
-
实例对象
实例对象由类对象创建出来,类对象就是生成实例对象的模板。
1,oop的大体步骤:
-
抽象出类对象
-
抽象出类对象的属性
-
抽象出类对象的行为(方法)
-
根据类对象创建实例
-
通过实例对象访问属性和方法
行为(方法)是类中特殊的函数;类属性就如下面所说,分为类属性和实例属性
https://blog.csdn.net/haruhi330/article/details/78811277
上面链接有对类属性和类方法的具体解释,这里还是记下一部分:
1:属性
尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。实例属性在每创建一个实例时都会初始化一边,不同实例的实例属性可能不同,但是实例的类属性都相同。
一:实例属性
初始化最好在__init__(self,...)中,
内部调用都要加上self.
外部调用时用instancename(实例名).propertyname(属性名)
内外部时相较于类对象而已
二:类属性
在__init__()外初始化
在内部用classname.类属性名调用
在外部既可以用classname.类属性名又可以用instancename.实例属性名来调用。
三:私有属性
-
单下划线_开头:只是告诉别人这是私有属性,外部仍然可以访问更改
2. 双下划线__开头:外部不可以通过instacename.propertyname来访问或者更改实际上将其转化为了_classname__propertyname(有待理解)
2:方法
1): 普通类方法:
def fun_name(self,...):
pass
外部实例调用
2):静态方法:@staticmethod
不能访问实例属性!!!
参数不能传入self!!!
与类相关但是不依赖类与实例的方法(需要进一步明确)
3):类方法:@classmethod
不能访问实例属性!!!
参数必须传入cls!!!
必须传入cls参数(即代表了此类对象——区别——self代表实例对象),并且用此来调用类属性:cls.类属性名
*@staticmethod与类方法都可以通过类或实例来调用。其两个的特点都是不能调用实例属性
简单总结:类属性和类方法时类固有的方法和属性,不会因为实例不同而改变。
继续:
类方法是类中特殊的函数,与普通函数的区别;
-
定义方法时,方法的第一个形参表示调用该方法的实力对象,第一个形参的名称通常时self,也可以时其他名称/
-
调用方法时,系统自动将调用该方法的实例对象作为实参传递给第一个形参。第1个实参传递给第2个形参,依此类推。
2.实例属性
绑定实例对象属性的方式有两种:
1.在类对象的内部:推荐在__init__方法中绑定,
self.属性名 = 属性值
2.在类对象外部
实例对象.属性名 = 属性值,若属性已存在,就是对属性进行修改
访问实例属性的两种方式:
-
在类对象的内部:self.属性名
-
在类对象的外部:实例对象.属性名
实例对象.__dict__:
可以获取该实例对象所绑定的所有属性及其值的字典
3.类属性
类属性指的是类对象所绑定的属性
绑定类属性(给类对象绑定属性)的方式有两种:
-
在类对象内部,但在方法之外:propertyname = propertyvalue
-
因为python是动态语言,所以可以在类外部动态的绑定属性,若属性已经存在就是对属性值进行更改:classname.propertyname = propertyvalue
访问类属性的方式也有两种:
-
在类对象的内部(方法中) : classname.propertyname
-
在类对象的外部:classname.propertyname 或者 instancename.propertyname
因为类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象也都可以访问类属性。
之所以添加'classname',是为了表明类属性被哪个类对象所绑定。
因为类属性可以通过classname.propertyname和instancename.propertyname来访问。当通过instacename.propertyname访问时,若指定实例对象中没有指定名称的实例属性,就会通过classname.propertyname来查找。所以当通过‘实例对象.属性名’的方式访问属性时,如果实例属性和类属性同名就会屏蔽类属性。
通过‘实例属性.属性名 = 属性值'的方式绑定属性时,这里的属性只表示实例属性(因为类属性没有这样的绑定方式),若已绑定就会更改属性值。