类的公有属性

一、概念

  我们前面提到类的私有属性,也就是类中不能直接访问的。但是不是可以直接访问的属性就是公有属性呢?其实也不是。在__init__()构造函数中的属性,对外基本都可以访问,但是他们并不是公有属性。那什么叫公有属性呢?

  定义: 指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性。

二、属性

2.1 成员属性

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name    #  成员属性,属于某个实例对象
        self.job = job
        self.phone = phone
        self.__address = address

    def get_private(self):
        return self.__address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
p2 = Person(‘Ashlex‘, ‘Police‘, ‘8833232‘, ‘bj‘)
print(p1.job, p2.job)

# 输出Doctor Police

  我们在Person类下定义了两个对象,p1和p2。很显然我们没有办法让p1来访问到p2 的job属性,即Police。那么在构造函数__init__()中的self.name等属性,被称之为 成员属性。

2.2 公有属性

class Person(object):
    nationality = ‘CN‘   # 定义公有属性

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.address = address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
p2 = Person(‘Ashlex‘, ‘Police‘, ‘8833232‘, ‘bj‘)

print(p1.nationality)
print(p2.nationality)

# 输出

CN
CN

  公有属性而言,所有实例对象访问它得到的值是一样的。

 

三、公有属性的特性  

  我们不仅可以访问,还能改变公有属性。 

class Person(object):
    nationality = ‘CN‘   # 定义公有属性

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.address = address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
p2 = Person(‘Ashlex‘, ‘Police‘, ‘8833232‘, ‘bj‘)

print(Person.nationality)  # 调用 公有属性
Person.nationality = ‘us‘   # 改变 公有属性
print(Person.nationality)

#输出

CN
us

  

3.1 单个实例调用和改变公有属性

# 依据上例

print("--------Befoer change---------")
print(Person.nationality)
print(p1.nationality)
print(p2.nationality)

print("--------after change---------")
print(Person.nationality)
p1.nationality = ‘JP‘
print(p1.nationality)
print(p2.nationality)

# 输出

--------Befoer change---------
CN
CN
CN
--------after change---------
US
JP
US

  p1在修改之前我们可以很好理解,因为大家都是调用的类Person的公有属性nationality,所以p1、p2的国籍属性是一样的,都是 ‘CN‘。但是为什么在p1修改过公有属性后,p2的国籍属性没有改变呢?

  

  在我们定义一个Person类的时候,其实在内存中就已经存在了,当然也包含了这个类的公有属性。在最初实例p1去调用类Person的nationality这个属性时,是直接引用类当中nationality的内存地址,而不是自己新增一个属性叫nationality。

  如下所示: 

print(id(Person.nationality))
print(id(p1.nationality))
print(id(p2.nationality))
print(Person.nationality, p1.nationality, p2.nationality)

#输出
1751236836128
1751236836128
1751236836128
CN CN CN

  这就可以解释为什么在Person类中的nationality改变为 ‘US‘ 时,p2也跟着改变。因为是直接引用内存当中的值。

 

p1.nationality = ‘JP‘

  在p1直接赋值nationality这个属性后,其实就实例p1为自己新增了一个成员变量,叫做nationality。只是他们的名称相同而已,但是两者之间并没有联系,甚至内存地址也不相同。

# p1.nationality = ‘JP‘
print(id(Person.nationality))
print(id(p1.nationality))
print(id(p2.nationality))
print(Person.nationality, p1.nationality, p2.nationality)

#输出
2434579585096
2434579585152
2434579585096
US JP US

  所以 p1.nationality=‘JP‘,并没有修改类Person的公有属性,而是为自己创建了一个新的成员属性,因此p1的改变对类的公有属性没有影响。

时间: 2024-10-04 16:35:32

类的公有属性的相关文章

类的私有属性 公有属性 继承 多态

私有属性 && 公有属性 1 #定义一个最简单的类 2 class person(object): 3 hometown = "china" #公有属性,所有类的对象共用的.使用对象.公有属性只会修改自己对象的公有属性,类名.公有属性会把所有对象的公有属性进行修改. 4 #原因是只要对象不调用公有属性是不会在自己本地创建其内存空间使用类共享的(类的实例化过程),只要本地修改就是在本地创建一个同名的变量而已,相当于局部变量,作用域屏蔽了类的公有属性 5 #构造函数,接收实

JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链 JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 1.Object类 在JS中,Object是所有类的基

get_class_vars--返回由类的默认属性组成的数组

array get_class_vars ( string $class_name ) 返回由类的默认公有属性组成的关联数组,此数组的元素以 varname => value 的形式存在. <?php class Person{    public $username;    public $age;    public $height;    public $weight;    static public $number = 0;        public function __cons

c#遍历并判断实体或类的成员属性

c#的Attribute有些类似java中的annotation,可以方便地在类成员中做修饰/限制作用. Demo: class ss { public stat BsonDocument Iterator(object obj){ MyAttr currAttr = null;// 自定义注解类 Type type = obj.GetType();// obj为传入的对象参数 //获取类名 String className = type.Name; //获取所有公有属性 PropertyInf

继承(指类之间共享属性和操作的机制)

继承(指类之间共享属性和操作的机制) 虚基类继承时要添加关键字virtual,以避免二义性. { 自己理解: 公有:基类的公有和保护成员作为派生类的公有和保护成员,在派生类类体内可以对基类进行公有和保护操作,基类私有不可访问.在main()函数内,派生类对象可以访问基类成员.虽然基类的私有成员不被派生类访问,但派生类还是包含了基类的私有数据成员. 保护:基类的公有和保护成员作为派生类的保护成员,在派生类类体内可以对基类进行保护操作,基类私有不可访问.在main()函数内,派生类对象不可访问基类任

对象方法、类方法、原型方法 &amp;&amp; 私有属性、公有属性、公有静态属性

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>test</title> </head> <body> <script> //对象构造函数 function Atest(name){ //私有属性,只能在对象构造函数内部使用 var class

js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别

1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <title>test</title> 5 </head> 6 <body> 7 <script> 8 //对象构造函数 9 function Atest(name){ 10 //私有属性,只能

第174天:面向对象——公有属性、私有属性和静态属性

一.公有属性和私有属性 1 //对象构造函数 2 //私有属性好处: 安全 就类似闭包中的函数一样 减少污染 3 function Person(name){ 4 //私有属性,只能在对象构造函数内部使用 5 var className = "用户对象"; 6 //公有属性,在对象实例化后调用 7 this.name = name; 8 //私有方法 9 var privateFunction = function(){ 10 alert(this.name); //公有属性 11 a

实体类、数据访问类中的属性拓展

类中: using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; namespace 实体类_数据访问类.App_Code { public class Users { SqlConnection conn = null; SqlCommand cmd = null; public Users() { conn = new S