Python学习 :面向对象 -- 成员修饰符

成员修饰符

两种成员

- 公有成员

- 私有成员, __字段名

 - 无法直接访问,只能通过内部方法来间接访问私有成员

简例:公有成员与私有成员 

class Info:
    country = ‘中国‘  # 静态字段    __gender = ‘男‘   # 静态字段私有化
    def __init__(self,name,age):
        self.name = name
        self.__age = age  # age字段为私有的,外部无法直接访问
    def show(self):
        return self.__age,Info.__gender
    def __get(self):
        print(‘私有方法‘)
    def gain(self):
        r = self.__get()
        return r

obj = Info(‘alex‘,19)
print(obj.name)
# print(obj.__age)  # 此时会报错,无法访问
res = obj.show()    # 方法在类中,故能通过方法在内部访问私有字段
print(res)
# obj.__get()       # 此时也会报错,无法访问
obj.gain()          # 通过内部方法来访问
>>>>>>>>>
alex
(19, ‘男‘)
私有方法

特殊成员

- __init__ 类()自动执行

- __call__ 对象() 类()() 自动执行

- __int__ int() 执行

- __str__ str() 执行

- __dict__ 对象.__dict__ 执行,将对象中封装的所有内容以字典的形式返回

简例:__call__方法

class Info:
    def __init__(self):
        print(‘init‘)

    def __call__(self, *args, **kwargs):        # 对象() 自动执行
        print(‘call‘)

obj = Info()
obj()       # 只执行__call__方法
Info()()    # 相当于 obj()()
>>>>>>>>>
init
call
init
call

简例:__int__方法 __str__方法 __dict__方法 __getitem__方法

class Info:
    def __init__(self,name,age):
        self.name = name
        self.age  = age

    # int 对象,自动执行__int__方法,并将返回值赋值给int对象
    def __int__(self):
        return 0

    # str 对象,自动执行__str__方法,并将返回值赋值给str对象
    def __str__(self):
        return ‘%s - %s‘ %(self.name,self.age)

    def __getitem__(self, item):
        return item

obj = Info(‘alex‘,20)
print(obj)              # 实际上 print()执行print(str(obj))
d = obj.__dict__
print(d)
res = Info.__dict__     # 查看类中的内容
print(res)
li = Info(‘mike‘,22)
res = li[‘APPLE‘]             # 自动执行 li 对象的类中的 __getitem__方法,’APPLE‘作为参数传递给item
print(res)
>>>>>>>>>
alex - 20
{‘name‘: ‘alex‘, ‘age‘: 20}
{‘__int__‘: , ‘__getitem__‘: , ‘__str__‘: , ‘__dict__‘: <attribute ‘__dict__‘ of ‘Info‘ objects>, ‘__init__‘: , ‘__doc__‘: None, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Info‘ objects>, ‘__module__‘: ‘__main__‘}
APPLE

metaclass , 类的本源 type

python中一切的事物都是对象,在调用类的时候都会经过 type类,python中默认 metaclass = type

简例:创建一个Mytype类来继承type类中的方法,在Mytype类中可以自定义自己需要的方法,而不必要一定执行type类中的方法

class Mytype(type):
    def __init__(self,*args,**kwargs):
        # self = Info类
        super(type, self).__init__()
    def __call__(self,*args,**kwargs):
        # self = Info类
        obj = self.__new__(self,*args,**kwargs)
        # 此时 r 为 Info类中的 __new__方法中返回的对象
        self.__init__(obj)

class Info(object,metaclass=Mytype):
    def __init__(self):
        print(‘hello world‘)    # obj = Info() 其实就是调用了类中的 __new__方法来创建obj对象
    def __new__(cls,*args,**kwargs):
        return object.__new__(cls,*args,**kwargs)
        # 此时创建了对象
    def func(self):
        print(‘hi world‘)

obj = Info()
>>>>>>>>>
hello world

值得注意的是obj 是对象,属于Info类

Info类也是对象 ,只不过是type类中的对象,type其实也是一个类

实际上类在执行阶段的执行顺序是: 对象 = 类() -- type类中的__call__方法 -- 类()中的__new__方法 -- 类中的 __init__方法 ;而并非之前所说的简单地调用了 __init__ 方法

原文地址:https://www.cnblogs.com/ArticleYeung/p/10500105.html

时间: 2024-10-13 10:37:44

Python学习 :面向对象 -- 成员修饰符的相关文章

Python面向对象成员修饰符

成员修饰符就是设置类的成员有些是公开的有些是私有的,公开的是在外部通过对象或者类可以调用,但是私有的只能通过类的内部才可以调用. 静态字段修饰 #!/usr/bin/env python # _*_coding:utf-8 _*_ class Foo:    # 公有的静态字段    ClassMembers = "公开的"    # 私有的静态字段    __ClassMembers = "私有的" # 执行公有的静态字段 print(Foo.ClassMembe

python学习笔记-Day8 上(pickle补充、字段、面向对象成员、成员修饰符、特殊方法)

pickle 序列化补充 # pickle load # 现在有两个python程序,调用关系如下 # s1.py class foo: …. Obj = foo(x,y) Pickle.dump(obj, open(‘db’,’wb’)) S2.py # s2.py from s1 import foo pickle.load(db) # s2.py 反序列化加载包含对象,一定要先导入对象对应的类,否则Pickle load将会报错 类多继承关系 有共同父类的继承关系如下 如图,如果我们有两个

Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property. 获取特性 class Foo: def __init__(self,name): self.name = name #

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传参的子类类型 面向对象总结: 面向对象是一种编程方式,此编程方式的实现是基于类和对象的使用 类:是一个模板,模板中包含了多个函数共使用,即类中可包含多个函数(类中的函数即叫做方法) 一般疑问: 1)什么样的代码才是面向对象? 简单来说,如果程序中的所有功能否是由 “类”和“对象”实现,那么就是面向对

.Net学习 第3季 C#面向对象 访问修饰符

.Net 视频学习第3季 C#面向对象 面向对象 访问修饰符 C#五种访问修饰符 1)可以修饰类的访问修饰符只有两个:public,internal(默认) internal:只可以在当前程序集(先理解为项目)中访问 public:公共的 项目A访问项目B中的public类,首先要在项目A的引用中添加项目B,然后再项目A的文件中添加using 项目B该类的命名空间. 在同一个程序集当中,public和internal的访问权限一样. 2)修饰类的成员的访问修饰符:public,private,p

python入门第二十四天----成员修饰符 类的特殊成员

1 #成员修饰符 修饰符可以规定内部的字段.属性.方法等 是共有的成员,私有的成员 2 class Foo: 3 def __init__(self,name,age): 4 self.name=name 5 self.age=age #可以在外部直接访问 6 7 obj=Foo('Jack',22) 8 print(obj.name) 9 print(obj.age) 共有字段 1 #成员修饰符 修饰符可以规定内部的字段.属性.方法等 是共有的成员,私有的成员 2 class Foo: 3 d

面向对象中的特殊的成员修饰符和几个特殊的方法

面向对象的成员修饰符 #Auther Bob #--*--conding:utf-8 --*-- # 成员修饰符 # 共有成员 # 私有成员 # 1.私有字段 # 私有的普通字段 # 私有的静态字段 # 2.私有方法 # 私有的方法 # 默认情况下,类的字段和方法都是共有的,通过对象和类就直接可以访问,但是如果我们在字段或者方法名字的前面加2个下划线,那么我们就不能在外部访问这些字段和方法,这些 # 方法和字段只能内部方法 class person(object): name = "diandi

Python类成员及类成员修饰符

13.面向对象:多态.继承.封装成员:字段:普通字段.静态字段方法:普通方法.静态方法.类方法特性:property,将方法伪造为字段,可以直接使用类.方法名调用,不用加() 成员修饰符:公有和私有,私有的字段和方法可以通过对象中的其他普通方法间接进行调用私有字段:__field, 以__双下划线开头的字段,私有字段只能在自己的对象中才能使用,继承后也无法使用私有方法:__function, 以__双下划线开头的方法,私有字段只能在自己的对象中才能使用,继