zoukankan      html  css  js  c++  java
  • 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) #登录成功 # 代码块,清晰 # 复用性.
  • 相关阅读:
    Windows系统CMD窗口下,MySQL建库、还原数据库命令操作示例
    Java JPA 报java.lang.IllegalArgumentException: Validation failed for query for method public abstract ...异常的一种原因和解决办法
    MySQL 5.7 执行SQL报错:1055
    Java8使用实现Runnable接口方式创建新线程的方法
    模板方法模式
    策略模式
    观察者模式
    装饰器模式
    原型模式
    单例模式
  • 原文地址:https://www.cnblogs.com/caodneg7/p/9379412.html
Copyright © 2011-2022 走看看