Python 面向对象设计基础实战【私有成员、保护成员、公有成员、数据成员、实例化、方法】

#面向对象,基础类
#cls 用于定义类方法,self 用于定义实例方法
class Car(object):
    def infor(self):
        print("This is a Cat!")

Irish_Moonshine = Car() #实例化一个对象
Irish_Moonshine.infor()

flag = isinstance(Irish_Moonshine, Car)#测试前者对象是否属于后者
print(flag)

flag = isinstance(Irish_Moonshine, str)
print(flag)

TypeI = type(Irish_Moonshine) #查看类型type
print(TypeI)

#私有对象,如果成员名以两个(或更多)下划线开头但是并不以两个(或更多)
#下划线结尾的成员变量,为私有成员!

#但Python并没有为私有成员提供严格的访问保护机制

class A:
    def __init__(self, value1 = 0, value2 = 0): #成员方法
        self.value1 = value1 #public
        self.value2 = value2 #public
    def setValue(self, value1, value2):
        self._value1 = value1 #protected 保护对象,只有类对象和子类对象可以访问
        self.__value2 = value2 #private 私有对象
    def show(self):
        print(self._value1)
        print(self.__value2)


Wnqq = A() #实例化对象

print(Wnqq.value1)
#0
print(Wnqq.value2)
#0
print(dir(Wnqq))#查看Wnqq的所有公开成员
#['__class__', '__delattr__', '__dict__', 
#'__dir__', '__doc__', '__eq__', '__format__', 
#'__ge__', '__getattribute__', '__gt__', '__hash__',
#'__init__', '__init_subclass__', '__le__', '__lt__',
#'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
#'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
#'__weakref__', 'setValue', 'show', 'value1', 'value2']


#print(Wnqq._value1) ERROR: 'A' object has no attribute '_value1'
#print(Wnqq.__value2) ERROR: 'A' object has no attribute '__value2'
#__xx__ :系统定义的特殊成员


#对象的数据成员一般在__init__中定义


class Demo(object):
    total = 0
    def __new__(cls, *args, **lwargs):
        if cls.total >=3:
            raise Exception('最多只创建3个对象')
        else:
            return object.__new__(cls)
    def __init__(self):
        Demo.total = Demo.total + 1

data1 = Demo()
data2 = Demo()
data3 = Demo()
#data4 = Demo() #Exception: 最多只创建3个对象 


class zzTest:
    def __init__(self, *args, **kwargs):
        print("init")
        print(self)

    @classmethod #如果有此句子,cls只是类;否则cls和self一样是实例化对象
#classmethod:Python装饰器类函数,属于整个类,类似于C++/JAVA中的静态函数。
#类方法有类变量cls传入,从而可以用cls做一些相关的处理。
#子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
#既可以在类内部使用self访问,也可以通过实例、类名访问。
#即在类的函数前加@classmethod属性,函数第一个参数为cls类,
#表示该函数是类的方法,而不需要绑定具体实例。
#在类方法里面可以调用类的属性,并且在类调用该函数时,
#会将自身作为第一个参数传入,类方法不能访问实例。实例可以调用类方法。


#使用@staticmethod或@classmethod,
#就可以不需要实例化,直接类名.方法名()来调用。
#这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,
#同时有利于命名空间的整洁。
#Reference:https://www.jianshu.com/p/417ac7d95db9

    def Wnqq(cls):
        print("cls")
        print(cls)

test = zzTest()
test.Wnqq()
#init
#<__main__.zzTest object at 0x00000235F8A32D30>
#cls
#<class '__main__.zzTest'>
print(test.__class__)
#<class '__main__.zzTest'>
zzTest().Wnqq() #因为@classmethod,所以可以不用实例化直接访问Wnqq()方法
#cls
#<class '__main__.zzTest'>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值