python面向对象与结构成员之间的关系
1面向对象结构分析:
----面向对象整体大致分为两块区域:
-------第一部分:静态字段(静态变量)部分
-------第二部分:方法部分
--每个区块可以分为多个小部分
class A: country = "美国" # 静态变量(静态字段) __cooage = 20 #私有静态变量(私有静态字段) def __init__(self,name,age): #普通方法(构造方法) self.name = name #对象属性(普通字段) self.__age = age #私有对象属性(私有普通属性) def func1(self): # 普通方法 pass def __func(self): #私有方法 pass @property def age(self): #属性 pass @classmethod #类方法 def class_func(cls): # 定义类方法,至少有一个cls参数 pass @staticmethod # 静态方法 def stact_func(): #定义静态方法,无默认参数 psaa
2面向对象的私有于公有
对于每一个类的成员而言都有两种形式:
-----共有成员,在任何地方都可以访问
-----私有成员,只有在自己类的内部才可以访问
------私有成员和共有成员的访问限制不同:
静态字段(静态变量)
--共有静态字段:类可以访问,类内部可以访问,派生类不能访问
---私有静态字段:仅类的内部可以访问
普通字段(对象属性)
---共有普通字段:对象可以访问,类内部可以访问,派生类可以访问
---私有普通字段:仅类的内部可以访问
方法:
---共有方法:对象可以访问,类内部可以访问,派生类可以访问
--私有方法:仅类的内部可以访问
总结:
对于这些私有成员来说,它们只能在本类的内部使用,不能再本类的外部以及派生类中使用.
ps:如果要在外部访问,可以通过_类__属性 访问
为什么可以通过._类__私有成员名?因为类在创建时
如果遇到私有成员(私有静态字段和私有方法)时
它会将其保存在内存时自动在前面加上_类名
3.面向对象的成员
1)字段
字段包括:普通字段和静态字段,它们在定义和使用中有所区别,
最本质的区别就是内存中保存的位置不同.
普通字段属于实例化对象,
静态字段属于类
静态字段在内存中只保存一份
普通字段在每个对象中都要保存一份
应用场景:通过类创建对象时,如果每个对象都具有相同的字段,那么就是要静态字段
2)方法
方法包括:普通方法,静态方法和类方法,三种方法在内存在内存中都归属于类,区别在于调用方式不一同.
--普通方法:由对象调用:至少一个self参数;执行普通方法时,自动将调用改方法的对象赋值给self
--类方法:由类调用;至少一个cls参数;执行类方法时,自动将调用改方法的类复制给cls
--静态方法:有类调用;无默认参数
相同点:对于所有的方法而言,均属于类(非对象)中,所以在内存中也只保存一份>
不同点:方法调用者不同,调用方法时自动传入的参数不同
classmethod
----类方法:通过类名调用方法,类方法中第一个参数约定俗称cls,python自动将类传给cls
静态方法
对类中的静态变量进行改变,要用类方法
继承中,父类得到子类类的类空间
1 class A: 2 age =12 3 def func(self): #普通方法 4 print(self) 5 @classmethod 6 def func1(cls): # 类方法,自动添加cls 次方法无需对象参与 7 print(333) 8 cls.age = 30 9 print(cls.age) #对B类中的内容进行修改 10 class B(A): 11 age = 15 12 B.func1() # <class '__main__.B'> 13 print(B.func1()) 14 print(B.__dict__) # 30 {'__module__': '__main__', 'age': 30, '__doc__': None} 对B类中的内容进行修改
不通过类方法,想让我的父类的某个方法得到子类的类空间里面的任意值
class A: age = 18 def func2(self): print(self) # self子类的对象,能得到子类空间的任何值 class B(A): age = 22 b1 = B() b1.func2() print(b1.func2()) print(b1.__dict__)
@staticmethod
# 静态方法:
class A: @staticmethod def login(username,password): if username == "alex" and password == 123: print("登录成功") else: print("登录失败") a = A() a.login("alex",123) #登录成功 # 代码块,清晰 # 复用性.