python对象的三种结构_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>

A.func0() #

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值