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) #登录成功 # 代码块,清晰 # 复用性.

 

posted @ 2018-07-27 19:53  Hear7  阅读(263)  评论(0编辑  收藏  举报