面向对象编程——类(class)2

一、类成员修饰符

公共成员:可以在类的外部访问到。我们之前接触到的都是公共成员

私有成员:只能在该类的内部才能直接访问到的(子类也不能直接访问);在外部,可以通过间接方法才能取得。 以字段(普通字段和静态字段相同)为例,开头加__(双下划线)使字段变为私有字段;方法也一样,方法名前面加__(双下划线)即可。

  • class db:
        def __init__(self,ip,username,passwd):
            self.__ip = ip
            self.__username = username
            self.__passwd = passwd
    
        def show(self):
            return self.__ip
    
    obj = db(‘1.1.1.1‘,‘root‘,‘123456‘)
    print(obj.__ip)         # 会报异常
    
    ip = obj.show()
    print(ip)               # 通过show方法才能拿到
    

二、类中的特殊成员

1、 构造方法 __init__方法

类() 自动执行

2、 类似构造方法,这里是一个特殊的调用方法 __call__方法

对象() 或者 类()() 自动执行

<pre>
class foo:
    def __init__(self):
        print("in init")

    def __call__(self,*args,**kwargs):
        print("in call")

obj = foo()         # 创建对象 obj
obj()               # 对象后面加括号,调用,则执行类中的__call__方法
</pre>

3、 特殊方法 __int__方法

<pre>
class foo:
    def __init__(self):
        pass

    def __int__(self):
        return 123

obj = foo()
print(obj,type(obj))

print(int(obj))         # 将obj对象强制转换为int类型。返回123

</pre>

在上面例子中,我们执行 int(对象),则自动执行 对象的\_\_int__方法,并将返回值赋值给 int(对象);

实际字符串强转整型时,就是这样。我们定义字符串时,其实是调用的str类,将我们定义的字符串的值传给了该类中。s = ‘bashrunning‘ 就是 s = str(‘bashrunning‘),可以看出,s就是一个对象。

同理,还有 __str__方法、列表的(__getitem__、__setitem__、__delitem__)方法。

我们用的比较多的是__str__方法。 使用案例:

class ourssh:
    def __init__(self,ip,username,passwd):
        self.ip = ip
        self.username = username
        self.passwd = passwd

    def __str__(self):
        return ‘ip=%s\nusername=%s\npasswd=%s‘ %(self.ip,self.username,self.passwd)

obj = ourssh(‘1.1.1.1‘,‘root‘,‘123456‘)

print(obj)          # 执行print时,实际上是执行的 str(obj)。如果ourssh类 中没有定义 __str__方法,则打印 <__main__.ourssh object at 0x0000018941FEB3C8>。定义了 __str__方法后,则打印 __str__方法返回的值

print操作,其实是两个步骤:print(abc) == print(str(abc))

步骤一: str(abc) ,调用 abc的__str__方法,得到返回值。 步骤二: print打印这个返回值。

4、 __dict__方法 ,对象里自带的         重要

<pre>
class foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        self.id = None

obj = foo("bash",22)

print(obj.__dict__)     # 返回一个字典 {‘name‘: ‘bash‘, ‘age‘: 22, ‘id‘: None} 这是这个对象的所有成员。如果成员是私有成员,则该成员的key为  _类名+该私有成员名

print(foo.__dict__)     # 返回一个字典,这个类的所有成员。 如果成员是私有成员,则该成员的key为  _类名+该私有成员名
</pre>

5、 for循环拆解

for循环遇到的对象是一个迭代器,则直接执行该对象的__next__方法。

for循环遇到的对象是一个可迭代对象,则先执行__iter__方法来获取迭代器,然后再执行__next__方法。

metaclass,元类,原始类,类的祖先

在python中,一切事物皆是对象。

__new__ 和 __metaclass__ 方法

创建类就可以有两种方式:

  • a). 普通方式

    class Foo(object):
    
        def func(self):
            print ‘hello wupeiqi‘
    
  • b).特殊方式(type类的构造函数)
    def func(self):
        print ‘hello wupeiqi‘
    
    Foo = type(‘Foo‘,(object,), {‘func‘: func})
    
    #type第一个参数:类名
    #type第二个参数:当前类的基类
    #type第三个参数:类的成员
    

类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

class MyType(type):

    def __init__(self, what, bases=None, dict=None):
        super(MyType, self).__init__(what, bases, dict)

    def __call__(self, *args, **kwargs):
        obj = self.__new__(self, *args, **kwargs)

        self.__init__(obj)

class Foo(object):

    __metaclass__ = MyType

    def __init__(self, name):
        self.name = name

    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)

# 第一阶段:解释器从上到下执行代码创建Foo类
# 第二阶段:通过Foo类创建obj对象
obj = Foo()

以上感谢武老师的博客。

反射

单例模式

原文地址:https://www.cnblogs.com/hacker001/p/10094786.html

时间: 2024-08-29 13:29:09

面向对象编程——类(class)2的相关文章

Python 面向对象编程——类和实例

1        面向对象编程 面向对象编程: 面向对象编程--Object OrientedProgramming OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消

面向对象编程——类(class)1

一.函数式编程 与 面向对象编程 def 函数名(参数): pass class 类名: def 函数名(self,参数): # self必填 pass z1 = 类名() # 这时,调用对象 z1,self参数即为 z1 例1: class bar: def foo(self,arg): print(self,arg) z1 = bar() print(z1) # <__main__.bar object at 0x0000019BC3088D30> z1.foo('wjz') # <

Day16:面向对象编程——类和对象

一.面向对象的程序设计 在此之前用到的事面向过程的程序设计,它的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是对象.程

Day28:面向对象编程——类和对象

一.面向对象的程序设计 在此之前用到的事面向过程的程序设计,它的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是对象.程

lua 面向对象编程类机制实现

lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype based 语言没啥优势. lua 如何构建class机制? https://github.com/fanqingsong/oopclass.lua 提供lua的 Object Oriented Programing Class 实现: 比其他实现更加轻量 https://github.com/Yonab

OC面向对象编程-类的声明和对象的创建

一 OC类的声明和实现 1.接口的声明 @interface NewClassName: ParentClassName { 实例变量 ... } 方法的声明 ... @end 2.类的实现 @implementation NewClassName { 方法的实现 //code ... } @end

【Python】[面向对象编程] 类和实例

1.注:必须牢记类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”2.定义类通过class 关键字:class 后面跟着类名,类名通常都是大写开头,接着是(object),表示类是从哪里继承俩的,所有类都继承 自object. class Student(object): pass 3.通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去: class Student(object): def __init__(self, name, scor

面向对象编程(类的绑定方法与非绑定方法)

链接 https://www.cnblogs.com/vipchenwei/p/7126772.html 1.对象绑定方法 1.凡是类中的方法和函数,都是绑定给对象使用的: 2.绑定方法都有自动传值的功能.传递进去的值,就是对象本身. 3.如果类想调用绑定方法,就必须遵循函数的参数规则,有几个参数,就必须传递几个参数. 2.类的绑定方法 类中方法默认都是绑定给对象使用,当对象调用绑定方法时,会自动将对象作为第一个参数传递进去:而类来调用,则必须遵循函数参数一一对应的规则,有几个参数,就必须传递几

python学习day11 面向对象编程 类和实例

class Student(object): #class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类. def __init__(self,name,score): #通过定义一个特殊的__init__方法,在创建实例的时候,就把类的name,score等属性绑上去,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__