续接类、对象

对象创建属性的两种方法:

1.函数执行后给对象追加属性,例如:

class Boy:
    def __init__(self):
        pass  #相当于空位符,保持语句完整
    def speak(self):
        print("我的名字是%s,今年%s岁"%(self.name,self.age))
a=Boy()
a.name="小明"#该方法不太严谨,不建议使用
a.age=23
a.speak()
生成结果
我的名字是小明,今年23岁
2.对象初始化时设置参数的属性并且当类的方法实例化时传入属性值(一般我们采用这种方式)
class Boy:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def speak(self):
        print("我的名字是%s,今年%s岁"%(self.name,self.age))
a=Boy("小明",27)
a.speak()
生成结果
我的名字是小明,今年27岁
类的实例创建
def __new__(cls,*args,**kwargs):
    return object.__new__(cls);#固定语法结构
__new__()函数只能用于从object继承的新类,cls表示需要实例化的类;*args表示可变参数

若__new__没有正确返回当前类cls的实例,那么__init__将不会被调用

class Boy:
    def __new__(cls, *args, **kwargs):
        print("执行__new__",args[0],args[1])
        return object.__new__(cls);
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print("执行__init__",name,age)
    def speak(self):
        print("我的名字是%s,今年%s岁"%(self.name,self.age))
a=Boy("小明",27)
a.speak()
生成结果
执行__new__ 小明 27  #说明了参数先传给new这个函数
执行__init__ 小明 27  #自动调用参数
我的名字是小明,今年27岁

公有和私有属性,方法:

公有属性:除了类以外所有的对象都可以访问的属性

私有属性:仅限于本类可以访问
class Boy:
    def __init__(self,name,age):
        self.name=name
        self.__age=age  两个下划线开头,声明该属性为私有不能在类地外部被使用或直接访问
    def speak(self):
        print("我的名字是%s,今年%s岁"%(self.name,self.age))
a=Boy("小明",27)
print("他的年龄:"%a.age) #结果AttributeError: 'Boy' object has no attribute 'age'
a.speak()
 
封装:某个类把所需要的属性和方法限制在类的访问区域内外界不能看到可以设置端口访问。
用到两个函数:get/set方法不写__init__方法
class Boy:
    def set_name(self,name):
        self.__name=name  #属性私有化
    def get_name(self):   #设置函数获得属性并返给外部的调用
        return self.__name;
a=Boy()
a.set_name("xiaoming")
print(a.get_name())

def __str__() 一个类的实例变成str,需要用特殊方法__str__()

class Person(object):  
    def __init__(self, name, gender):   

        self.name = name  
        self.gender = gender  
  
p = Person('Bob', 'male')  
print (p)  
>>> <__main__.Person object at 0x02171270>  

  1. class Person(object):  
  2.     def __init__(self, name, gender):  
  3.         self.name = name  
  4.         self.gender = gender  
  5.     def __str__(self):  
  6.         return '(Person: %s, %s)' % (self.name, self.gender)  
  7. p = Person('Bob', 'male')  
  8. print (p)  
  9. >>>  (Person: Bob, male)  
.公有方法和私有方法;

  私有方法在方法前加两个下划线:def __text():

 自动销毁方法:__del__(): 当对象没有引用的时候,或程序结束的时候,程序自动调用__del__()     
[html]  view plain  copy
  1. class Person:  
  2.      def __init__(self,name,age):  
  3.          self.name=name  
  4.          self.age=age  
  5.      def __del__(self):  
  6.          print("对象张三被销毁")  
  7. zhangsan=Person("张三",20)  
  8. zhangsan.__del__()  
  9. >>> 对象张三被销毁  
  10.     对象张三被销毁  

测试对象有多少次引用 

    import sys

    t=T()

    sys.getrefcount(t)返回2  从2开始

[html]  view plain  copy
  1. import  sys  
  2. class Person:  
  3.     def __init__(self,name,age):  
  4.         self.name=name;  
  5.         self.age=age;  
  6. zhangsan=Person("张三",20)  
  7. print(sys.getrefcount(zhangsan))  
  8. >>> 2  

id()函数 查看对象的内存地址;

p="姐姐"
print(id(p)) #51850336
str1=[1,2,3,4]
print(id(str))#1732892336

.类属性:属于类成员,对象共有的;

    类方法:cls 表明是 类

                  在方法上添加 @classmethod装饰器

                  def class_method(cls):

                  可以通过类方法调用类属性,也可以通过对象调用类属性;
   
    修改类属性的2种方式:

                  1.类名.类属性=... 
                  2.实例对象__class__类属性=...

    静态方法:前面加@staticmethod,静态方法可以加参数,与类和对象都没有关系,也可以通过类和对象调用;


[html]  view plain  copy
  1. class Person:  
  2.     def __init__(self,name,age):  
  3.         self.name=name;  
  4.         self.age=age;  
  5.   
  6.     def showInfo(self):  
  7.         print("姓名{0} 年龄{1}".format(self.name, self.age))  
  8.   
  9.     @staticmethod  
  10.     def goHome(self,name, by):  
  11.         print(name, "回家...", by)  


18. dir()   __dir__  展示一个类/对象的内部属性和函数;

[html]  view plain  copy
  1. dir(zhangsan);  
  2. zhangsan.__dir__()  





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值