Python ##2 面向对象编程

class OldStyle:
    def __init__(self,name ,description):
        self.name = name
        self.description = description
        
class NewStyle:
    def __init__(self, name, description):
        self.name   = name
        self.description = description
        
if __name__ == '__main__':
    old = OldStyle('old','Old style class')
    print (old)
    print (type(old))
    print (dir(old))
    print("_________________________________________")
    new = NewStyle('new','New style class')
    print(new)
    print(type(new))
    print (dir(new))
'''
定义类的属性
直接在类里定义
在构造函数中定义

访问控制?
其实没有访问控制
Python没提供私有属性的功能
全靠自觉

常用属性定义
class Programer(object):
    def __init__(self, name , age , weight):
        self.name = name 
        self._age = age  编程规范上的私有类
        selg.__weight = weight 
'''

类的继承

定义类的继承
class DerivedClassName(BaseClassName):
    <statement -1>
    .
    .
    .
    <statement -n>
    
继承的子类
也可以自觉定义,覆盖父类的属性和方法

用super()调用父类的方法
class A(object):
    def method(self,arg):
        pass
        
class B(A):
    def method(self,arg):
        A.method(arg)

子类的类型判断
isintstance
issubclass

多继承
class DerivedClassName(Base1,Base2,Base3):
     <statement -1>
    .
    .
    .
    <statement -n>

类的多态
多态的要素
继承
方法从写

常用的类定义
class Person(object):
    def __init__(self , name, age)
    self.name = name
    self.age = age
    
def __new__(cls) 创建类的对象
def __init__(self) 初始化对象

回收对象
__del__()

用Magic Method实现的好处
优雅
被Python的标准语法支持

比较运算符
__cmp__(self,other)
__eq__(self,other)
__lt__(self,other)
__gt__(self,other)

数字运算符
__add__(self,other)
__sub__(self,other)
__mul__(self,other)
__div__(self,other)

逻辑运算符
__or__(self,other)
__and__(self,other)

转换为字符串
__str__
__repr__
__unicode__

展现对象属性
__dir__

设置对象属性
__setattr__(self,name,value):

需要注意的
def __setattr__(self,name,value):
    setattr(self,name,vale)  错误的

def __setattr__(self, name , value)
    self.__dict__[name] = value  正确的

查询对象属性
__getattr__(self, name):
__getattribute__(self,name):

输出对象属性
__delattr__(self,name):

class Programer(object):
    hobby = 'Play Computer'
    def __init__(self, name , age , weight):
        self.name = name 
        self._age = age  #编程规范上的私有类
        self.__weight = weight    
    
    @classmethod
    def get_hobby(cls):
        return cls.hobby
    
    @property
    def get_weight(self):
        return self.__weight 
    def self_introduction(self):
        print ("My name  is %s \nI am %s years old\n" % (self.name ,self._age))
        
if __name__=="__main__":
    programer = Programer('Albert',25,80)
    print (dir(programer))
    print (programer.__dict__)
    print (programer.get_weight)
    print (programer.get_hobby)
    programer.self_introduction()
class Programer(object):
    hobby = 'Play Computer'
    def __init__(self, name , age , weight):
        self.name = name 
        self._age = age  #编程规范上的私有类
        self.__weight = weight    
    
    @classmethod
    def get_hobby(cls):
        return cls.hobby
    
    @property
    def get_weight(self):
        return self.__weight 
    def self_introduction(self):
        print ("My name  is %s \nI am %s years old\n" % (self.name ,self._age))
        
class BackendProgramer(Programer):
    def __init__(self , name ,age , weight, language):
        super(BackendProgramer,self).__init__(name, age , weight)
        self.language = language
        
if __name__=="__main__":
    programer = BackendProgramer('Albert',25,80,'Python')
    print (dir(programer))
    print (programer.__dict__)
    print (type(programer))
    print (isinstance(programer,Programer))                             
class Programer(object):
    hobby = 'Play Computer'
    def __init__(self, name , age , weight):
        self.name = name 
        self._age = age  #编程规范上的私有类
        self.__weight = weight    
    
    @classmethod
    def get_hobby(cls):
        return cls.hobby
    
    @property
    def get_weight(self):
        return self.__weight 
    def self_introduction(self):
        print ("My name  is %s \nI am %s years old\n" % (self.name ,self._age))
        
class BackendProgramer(Programer):
    def __init__(self , name ,age , weight, language):
        super(BackendProgramer,self).__init__(name, age , weight)
        self.language = language
    
    def self_introduction(self):
        print ("My name  is %s \nMy favorite language is %s\n" % (self.name ,self.language))

def introduce(programer):
    if isinstance(programer,Programer):
        programer.self_introduction()
if __name__=="__main__":
    programer = Programer('Albert',25,80)
    backend_programer = BackendProgramer('Tim',30,70,'python')
    introduce(backend_programer)
    introduce(programer)
    
#类的方法也是类的属性
class Test(object):
    def test(self):
        pass
if __name__=="__main__":
    a = Test()
    print (a.test)
    a.test = '123'
    print (a.test)
#定义类的方法
# @classmethod
#调用的时候用类名,而不是某个对象
#@property
#像访问属性一样调用方法
class Programer:
    
    def __new__(cls, *args , **kwargs):
        print("call __new__method")
        print (args)
        return super(Programer ,cls).__new__(cls)
    def __init__(self,name,age):
        print('call __init__ method')
        self.name = name
        self.age = age
if __name__ == '__main__':
    programer = Programer('Albert',25)
    print (programer.__dict__)
class Programer(object):
    def __init__(self , name, age):
        self.name = name
        if isinstance(age,int):
            self.age = age
        else:
            raise Exception('age must be int')
    
    def __eq__(self,other):
        if isinstance(other , Programer):
            if self.age == other.age:
                return True
            else:
                return False
        else :
            raise Exception('The type of object must be Programer')
            
    def __add__(self, other):
        if isinstance(other, Programer):
            return self.age + other.age
        else:
            raise Exception('The type of object must be Programer')
if __name__ == '__main__':
    p1 = Programer('Albert',25)
    p2 = Programer('Bill',30)
    print (p1 == p2)
    print (p1+p2)
            
class Programer:
    def __init__(self , name, age):
        self.name = name
        if isinstance(age,int):
            self.age = age
        else:
            raise Exception('age must be int')
#     def __str__(self):
#         return '%s is %s years old'%(self.name , self.age)
#     def __dir__(self):
#         return self.__dir__.keys()
# 编译错误:AttributeError: 'function' object has no attribute 'keys'    
if __name__ == '__main__':
    p = Programer('Albert',25)
    print (p)
    print (dir(p))
            
class Programer(object):
    def __init__(self, name , age ):
        self.name = name 
        self.age = age  #编程规范上的私有类
    
    def __getattribute__(self,name):
#         return getattr(self, name)
#         return self.__dict__[name]
        return super(Programer,self).__getattribute__(name)
    def __setattr__(self,name,value):
        setattr(self,name,value)
        #self.__dict__[name] = value
if __name__=='__main__':
    p = Programer('Albert',25)
    print (p.name)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值