博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象_类成员
阅读量:6007 次
发布时间:2019-06-20

本文共 4515 字,大约阅读时间需要 15 分钟。

  面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用。类是一个模板,模板中包含了多个'函数'供使用,对象是根据模板创建的实例,实例用于调用被包装在类中的函数。

类成员

  类的成员可以分为三类:字段、方法和属性

  所有成员中,只有普通字段的内容保存在对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象多少,在内存中只创建一份

字段

  字段包括普通字段和静态字段。普通字段属于对象,静态字段属于类。它们在定义和使用中有所却别,而本质的区别是内存中保存的位置不同。静态字段在内存中只保存一份,普通字段在每个对象中都要保存一份

class Province():    country = 'China'      #静态字段    def __init__(self,name):        self.name = name   #普通字段obj = Province('四川省')print(obj.name)           #访问普通字段print(Province.country)   #访问静态字段

方法

  方法包括:普通方法,静态方法和类方法。三种方法在内存中都归属于类,区别在于调用方式不同

class Animal():    name = 'animal'    def __init__(self,name):        self.name = name    def ord_func(self):     #普通方法,即绑定到对象的方法        print('普通方法由对象调用,自动将对象赋值给self,对象的名字为%s'%self.name)    @classmethod    def class_method(cls):  #类方法,即绑定到类的方法        print('类方法由类调用,自动将该方法的类赋值给cls,类的名字为%s'%cls.name)    @staticmethod    def static_method():    #静态方法,即非绑定方法,不会自动传值        print('静态方法无默认参数')cat = Animal('cat')cat.ord_func()        #对象也可以调用类方法,自动将该对象所属的类赋值给clscat.class_method()cat.static_method()   #对象和类都可以调用静态方法

属性

  在普通方法的基础上添加@property装饰器,访问该属性就和访问该字段相同了。属性即将内部进行一系列逻辑运算,最终将计算结构返回,调用该属性即可获得最终的返回值。

class myBMI():    def __init__(self,height,weight):        self.height = height        self.weight = weight    @property    def MBI(self):        return self.height/self.weight**2tom = myBMI(175,75)print(tom.MBI)

  属性的两种定义方式

#装饰器方式class Goods:    def __init__(self):        self.original_price = 100        self.discount = 0.8    @property    def price(self):        new_price = self.original_price * self.discount        return new_price    @price.setter    def price(self, value):        self.original_price = value    @price.deleter    def price(self):        del self.original_priceobj = Goods()obj.price         # 获取商品价格obj.price = 200   # 修改商品原价print(obj.price)del obj.price     # 删除商品原价
装饰器方式
class Animal():    def __init__(self,name):        self.name = name    def get_name(self):        return self.name    NAME = property(get_name)cat = Animal('cat')print(cat.NAME)
静态字段方式
# property的构造方法中有个四个参数# 第一个参数是方法名,调用 对象.属性 时自动触发执行方法# 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法# 第三个参数是方法名,调用 del对象.属性 时自动触发执行方法# 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息class Goods(object):    def __init__(self):        self.original_price = 100        self.discount = 0.8    def get_price(self):        new_price = self.original_price * self.discount        return new_price    def set_price(self, value):        self.original_price = value    def del_price(self):        del self.original_price    PRICE = property(get_price, set_price, del_price, '价格属性描述...')obj = Goods()obj.PRICE         # 自动调用第一个参数中定义的方法:get_priceobj.PRICE = 200   # 自动调用第二个参数中定义的方法:set_price方法,并将“200”当作参数传入obj.PRICE.__doc__  # 自动获取第四个参数中设置的值:价格属性描述。。。del obj.PRICE     # 自动调用第三个参数中定义的方法:del_price方法
View Code

类成员的修饰符

   对于每一个类的成员都有两种形式:公有成员和私有成员。公有成员在任何地方都能访问,私有成员只有在类的内部才能访问

定义

#定义不同class Foo():    def __init__(self):        self.name = '公有字段'        self.__foo = '私有字段' #私有成员命名时前两个字符是下划线,特殊成员除外:__init__,__call__等

访问

   静态字段

#公有静态字段:类可以访问;类内部可以访问;派生类中可以访问#私有静态字段:仅类内部可以访问class C:    name = "公有静态字段"    def func(self):        print (C.name)class D(C):    def show(self):        print (C.name)C.name         # 类访问obj = C()obj.func()     # 类内部可以访问obj_son = D()obj_son.show() # 派生类中可以访问class C:    __name = "私有静态字段"    def func(self):        print (C.__name)class D(C):    def show(self):        print (C.__name)C.__name       # 类访问            ==> 错误obj = C()obj.func()     # 类内部可以访问     ==> 正确obj_son = D()obj_son.show() # 派生类中可以访问   ==> 错误
View Code

   普通字段

#公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问#私有普通字段:仅类内部可以访问#如果想要强制访问私有字段,可以通过 【对象._类名__私有字段明 】访问(如:obj._C__foo),不建议强制访问私有成员#公有字段class C():    def __init__(self):        self.foo = "公有字段"    def func(self):        print        self.foo    # 类内部访问        class D(C):            def show(self):                print                self.foo    #派生类中访问        obj = C()        obj.foo  # 通过对象访问        obj.func()  # 类内部访问        obj_son = D();        obj_son.show()  # 派生类中访问#私有字段class C():    def __init__(self):        self.__foo = "私有字段"    def func(self):        print        self.foo    # 类内部访问        class D(C):            def show(self):                print                self.foo    #派生类中访问        obj = C()        obj.__foo  # 通过对象访问    ==> 错误        obj.func()  # 类内部访问        ==> 正确        obj_son = D();        obj_son.show()  # 派生类中访问  ==> 错误
View Code

   属性的访问与字段相似,即:私有成员只能在类内部使用。非要访问私有属性的话,可以通过对象.__类__属性名 

  

转载于:https://www.cnblogs.com/iamluoli/p/9921623.html

你可能感兴趣的文章
payload和formData有什么不同?
查看>>
131016
查看>>
第六次作业
查看>>
python 自动化测试HTTP接口
查看>>
题解——loj6280 数列分块入门4 (分块)
查看>>
Nginx配置文件nginx.conf详解
查看>>
Ubuntu下实现socks代理转http代理
查看>>
使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住
查看>>
Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...
查看>>
ulimit用法简介
查看>>
tomcat 配置首页
查看>>
PHP工厂模式的好处
查看>>
半年拾遗
查看>>
URL加随机数的作用
查看>>
介绍dbms_registry PL/SQL程序包
查看>>
Sketchup二次开发之添加组
查看>>
判断radiobutton是否被选中
查看>>
配置 SSH Key ☞ GitHub
查看>>
操作系统思考 第零章 前言
查看>>
kmdjs和循环依赖
查看>>