Python面向对象之结构与成员

Posted 小学弟-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象之结构与成员相关的知识,希望对你有一定的参考价值。

1.面向对象结构分析:
----面相对象整体大致分为两块区域:
--------第一部分:静态字段(静态变量)部分
--------第二部分:方法部分
--每个大区域可以分为多个小部分:
class A:
    cooname = \'Jake\'  # 静态变量(静态字段)
    __cooage = 20  # 私有静态变量(私有静态字段)

    def __init__(self, name, age):  # 普通方法(构造方法)
        self.name = name  # 对象属性(普通字段)
        self.__age = age  # 私有对象属性(私有普通字段)

    def func1(self):  # 普通方法
        pass

    def __func(self):  # 私有方法
        pass

    @property
    def prop(self):  # 属性
        pass

    @classmethod  # 类方法
    def class_func(cls):
        \'\'\'定义类方法,至少有一个cls参数\'\'\'
        pass

    @staticmethod  # 静态方法
    def stact_func():
        \'\'\'定义静态方法,无默认参数\'\'\'
        pass

2.面向对象的私有与公有
对于每一个类的成员而言都有两种形式:
----共有成员,在任何地方都可以访问
----私有成员,只有在类的内部才能访问

--------私有成员和共有成员的访问限制不同:


静态字段(静态变量)
--共有静态字段:类可以访问,类内部可以访问,派生类中可以访问
--私有静态字段:仅类内部可以访问
普通字段(对象属性)
--共有普通字段:对象可以访问,类内部可以访问,派生类中可以访问
--私有普通字段:仅类内部可以访问
方法:
--共有方法:对象可以访问,类内部可以访问,派生类中可以访问
--私有方法:仅类内部可以访问

总结:
对于这些私有成员来说,他们只能在类的内部使用,不能在类的外部以及派生类中使用.
ps:非要访问私有成员的话,可以通过 对象._类__属性名,但是绝对不允许!!!
为什么可以通过._类__私有成员名访问呢?因为类在创建时,
如果遇到了私有成员(包括私有静态字段,私有普通字段,私有方法)
它会将其保存在内存时自动在前面加上_类名.

3.面向对象的成员
1)字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,
而最本质的区别是内存中保存的位置不同,
--普通字段属于对象
--静态字段属于类
 
由上图:

静态字段在内存中只保存一份
普通字段在每个对象中都要保存一份
应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
2)方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
--普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
--类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
--静态方法:由类调用;无默认参数;
 
如上图:
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。

4.property classmethod staticmethod

1)property #将一个方法,伪装成属性
class Bmi(object):
    def __init__(self, name, weight, highe):
        self.name = name
        self.weight = weight
        self.height = highe

    @property
    def func(self):
        BMI = self.weight / (self.height ** 2)
        return BMI


person = Bmi(\'Tom\', 80, 1.73)
s = person.name
ss = person.func #将方法伪装成属性
print(\'%s的BIM指数为%s\' % (s, ss))

--------------------------------------------------
class Person():
    def __init__(self, name, age):
        self.name = name
        self.__age = age if type(age) is int else print(\'重新输入\')

    @property     #执行查询操作自动执行此操作
    def age(self):
        return self.__age

    @age.setter     #执行更改操作执行此操作
    def age(self, temp):
        self.__age = temp if type(temp) is int else print(\'重新输入\')

    @age.deleter    #执行del操作自动执行此方法
    def age(self):
        del self.__age


2)classmethod
----类方法:通过类名调用方法,类方法中第一个参数约定俗称cls,python自动将类名传给cls
class A:
    def func(self):  # 普通方法
        print(self)

    @classmethod
    def func0(cls):  # 类方法
        print(cls)


a = A()
a.func()  # <__main__.A object at 0x105d8a438>
A.func0()  # <class \'__main__.A\'>
a1 = A()
a1.func0()  # 对象调用类方法,cls 得到的是类本身.

****¥类方法应用场景
1-类中一些方法不需要对象参与
2-对类中静态变量进行改变
3-继承中,父类得到子类的类空间
例子:
class A:
    age = 10

    @classmethod
    def func(cls):
        print(cls.age)


class B(A):
    age = 20


B.func()  # 20

3)staticmethod
由类名调用,无默认参数,主要作用是:能够使代码清晰,复用性强!

 

以上是关于Python面向对象之结构与成员的主要内容,如果未能解决你的问题,请参考以下文章

2Python全栈之路系列之面向对象进阶及类成员

Python之路第六篇python基础 之面向对象

Python之面向对象进阶

python面向对象之成员

Python基础之面向对象2(封装)

Python之面向对象与类