码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象(五)

时间:2019-01-27 16:34:06      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:method   操作   turn   second   discount   删除   port   test   其他   

  • 类的私有成员
  • 类的其他成员
  • issubclass和isinstance
  • 元类
  • 反射
  • 双下方法

类的私有成员:

  类的私有静态属性,类的私有方法,对象的私有属性

从类的外部,内部,子类的角度去研究

#Python中的私有在属性或方法前加双下即可
class Person:
    __country=‘China‘#私有静态属性

    def __init__(self,name,age):
        self.name=name
        self.__age=age#对象的私有属性

    def __func(self):#私有方法
        print(‘in __func ‘)

    def func1(self):
        print(Person.__country)
        Person.__func(self)

class A(Person):
    def func(self):
        Person.__country
        Person.__func(self)
        print(self.__age)

# 私有静态属性:
    # 类的外部:不可以
    # print(Person.__country)

    #类的内部:可以
    # Person.func1(1)

    #对象可以查看私有静态属性? 不可以
    # obj=Person()
    # print(obj.__country)

# 私有方法:
    # 类的外部:不可以
    # Person.__func(1)

    # 类的内部:可以

    # 对象掉用私有方法可以吗?不可以
    # obj=Person()
    # obj.__func()

# 对象的私有属性
    # 类的外部:不可以
    # obj=Person()
    # print(obj.__age)
    
    # 类的内部:可以
    
    # 子类调用?也不可以

# 这些私有的属性,方法的本质是名字前面加了_类名,变相的私有
# 总结:私有的属性,方法只能内部使用

 

类的其他成员:

  类方法,静态方法,属性

class A:
    def __init__(self):#双下方法,特殊方法
        pass
    
    def func(self):#实例化方法,给对象用的方法,会默认把对象传递给第一个参数self
        pass

    @classmethod
    def class_method(cls):#类方法,给类使用的方法,它会默认把本类传递给第一个参数cls
        pass

    @staticmethod
    def static_method():#不依赖于类和对象,只是一个函数
        pass

    @property
    def price(self):#属性,有一些方法名,听起来像属性的
        pass

  

类方法:

# 实例化一个对象,最后得到对象的总数
class Student:
    __count=0
    def __init__(self,name,age):
        self.name=name
        self.age=age
        Student.sum_num()

    @classmethod
    def sum_num(cls):
        cls.__count+=1

    @classmethod
    def get_count(cls):
        return cls.__count

alex=Student(‘alex‘,10)
alex1=Student(‘alex1‘,10)
alex2=Student(‘alex2‘,10)
# print(alex2.get_count())
ret=Student.get_count()
print(ret)

# 总结:
# 类方法一般是用来操作静态属性的,与对象无关的时候需要调用类方法
# 对象也可以调用类方法,不推荐

  

静态方法:

 

#静态方法是一个独立的,单纯的函数
#譬如,我想定义一个关于时间操作的类,其中有一个获取当前时间的函数
import time

class TimeTest(object):
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())


print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)
#总结:对象和类都可以掉静态方法

  

属性:

class Goods:
    def __init__(self,name,origi_price,discount,):
        self.name=name
        self.origi_price=origi_price
        self.discount=discount

    @property
    def price(self):
        return self.origi_price*self.discount

apple=Goods(‘苹果‘,5,0.8)
print(apple.price)
# 总结:属性装饰的是一些函数名听起来很像属性的方法。
#         只要对象调用,就行其中的代码

 

属性setter delete的使用

# 属性的全解
class A:

    @property
    def price(self):
        print(‘对象调用我‘)

    @price.setter
    def price(self,new):
        print(‘对象修改我‘)

    @price.deleter
    def price(self):
        print(‘对象删除我‘)

a=A()
a.price#对象调用我
a.price=1#对象修改我
del a.price#对象删除我
# 总结:
# 这些调用的本质是在触发,一旦触发就执行其中的代码
# 不推荐,在对象的属性与property伪装的属性(方法)同名,有坑

  

isinstance

issubclass

class A:
    pass

class B(A):
    pass

obj=B()

print(isinstance(obj,B))
print(isinstance(obj,A))
# isinstance(o,a)是判断o是不是这个类(这个类的派生类)的对象

print(issubclass(B,A))
#判断B是不是A的子类

  

元类:就是type,元类创建出了Object,str,list这些类

 

反射:

# 反射:通过字符串对对象进行操作
# 可以操作的对象有:
#     实例化的对象,类,本模块,其他模块(可以.的都可以反射)
# hasattr()
# getattr()
# setattr()
# delattr()

# 实例化的对象
class A:
    country=‘China‘
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def func(self):
        print(‘in func‘)

obj=A(‘alex‘,18)
if hasattr(obj,‘name‘):
    print(getattr(obj,‘name‘))
增
setattr(obj,‘sex‘,‘man‘)
print(obj.__dict__)
删delattr(obj,‘sex‘)
print(obj.__dict__)



# 具体应用
class User:
    def login(self):
        print(‘登陆‘)
    def register(self):
        print(‘注册‘)
obj=User()
while 1:
    msg=input(‘>>>‘).strip()
    if hasattr(obj,msg):
        getattr(obj,msg)()

  

面向对象(五)

标签:method   操作   turn   second   discount   删除   port   test   其他   

原文地址:https://www.cnblogs.com/liuer-mihou/p/10326202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!